CF126B password&&HDU 4763 Theme Section

http://acm.hdu.edu.cn/showproblem.php?pid=4763

http://codeforces.com/problemset/problem/126/B

这两个题都是在考察next的应用。区别在于一个是不能有重叠,一个是可以有重叠。

一级条件,前后缀都存在;二级条件 在之前存在前后缀。

对于可以重叠的,很简单,利用next记录一下前缀后缀都存在的那些点,然后跑一遍循环找一下这些满足一级条件的哪些满足二级条件,就ok了。

不可以重叠的,其实就是加了一个零级条件,判断长度,还有一个四级条件,还是长度。

还是有收获的。

对于next理解又多了一点,标注next其实就是标注这个位置之前是否满足前后缀一样。满足就美滋滋了。

贴代码,具体体会一下

 1 #include <cstdio>
 2 #include <iostream>
 3 #include <string.h>
 4 #include <string> 
 5 #include <map>
 6 #include <queue>
 7 #include <deque>
 8 #include <vector>
 9 #include <set>
10 #include <algorithm>
11 #include <math.h>
12 #include <cmath>
13 #include <stack>
14 #include <iomanip>
15 #define mem0(s1) memset(s1,0,sizeof(s1))
16 #define meminf(s1) memset(s1,0x3f,sizeof(s1))
17 #define ll long long
18 using namespace std;
19 int nex[1000005],l1,l2;
20 void getn(int n,char c[])
21 {
22     int i=0,j=-1;
23     nex[0]=-1;
24     while(i<n)
25     {
26         if(j==-1||c[i]==c[j])
27         {
28             i++;j++;nex[i]=j;
29         }
30         else j=nex[j];
31     }
32     return;
33 }
34 int f[1000005];
35 int main()
36 {
37     int t;
38     cin>>t;
39     char s[1000005];
40     while(t--)
41     {
42         scanf("%s",s);
43         int l=strlen(s);
44         getn(l,s);
45         mem0(f);
46         int tmp=l;
47         while(tmp>0)
48         {
49             if(l>=2*tmp) f[tmp]=1;
50             tmp=nex[tmp];
51         }
52         int ans=0;
53         for(int i=l-1;i>1;i--)
54         {
55             tmp=i;
56             while(tmp>0){
57             if(f[tmp]&&i>=2*tmp&&l>=tmp+i)
58             {
59                 ans=max(ans,tmp);break;
60             }
61             tmp=nex[tmp];
62             }
63         }
64         cout<<ans<<endl;
65     }
66 }
View Code
 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 #define mem0(a) memset(a,0,sizeof a)
 4 #define ll long long
 5 int nxt[1000006],vis[1000005];
 6 inline void getn(int len,char s[])
 7 {
 8     int i,j;
 9     nxt[0]=-1;
10     for (i=0;i<len;++i)
11      {
12          j=nxt[i];
13          while (j!=-1&&s[j]!=s[i]) j=nxt[j];
14          nxt[i+1]=j+1;
15      }
16     return;
17 }
18 int main()
19 {
20     char s[1000005];
21     while(~scanf("%s",s))
22     {
23         int l=strlen(s);int ans=0;
24         int flag=0;
25         getn(l,s);
26         int maxx=nxt[l];
27         mem0(vis);
28         vis[maxx]=1;
29         if(maxx==0) puts("Just a legend\n");
30         else 
31         {
32             while(maxx>0){
33             vis[maxx]=1;
34             maxx=nxt[maxx];
35         }
36           for(int i=2;i<l;++i)
37           {
38               if(vis[nxt[i]]&&nxt[i]>ans) 
39                ans=nxt[i],flag=1;
40           }
41           if(!flag) puts("Just a legend\n");
42           else printf("%s\n",s+l-ans);
43         }
44     }
45     return 0;
46 }
View Code

猜你喜欢

转载自www.cnblogs.com/TYH-TYH/p/9382988.html