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 }
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 }