博客1:KMP的介绍和解释
博客2:next数组的应用
代码:
hdu 3336
#include<stdio.h> #include<algorithm> #include<iostream> using namespace std; const int max_=2e5+2; const int mod=1e4+7; int n; int nex[max_]; char str[max_]; void getnext() { nex[0]=-1; int k=-1,i=0; while(i<n) { while(k>-1&&str[k]!=str[i]) k=nex[k]; nex[++i]=++k; } } int getsum() { getnext(); int ans=0; for(int i=1;i<=n;i++) { if(nex[i]>0) { ans=(ans+2)%mod; } else ans=(ans+1)%mod; } return ans; } int main() { int t; cin>>t; while(t--) { scanf("%d%s",&n,str); int sum=getsum(); /*for(int i=1;i<=n;i++) printf("%d ",nex[i]);*/ printf("%d ",sum); } }
代码:1358
#include<stdio.h> #include<algorithm> #include<iostream> using namespace std; const int max_=1e6+5; int n; char str[max_]; int nex[max_]; void getnext() { int k=-1; int i=0; nex[0]=-1; while(i<n) { while(k>-1&&str[k]!=str[i]) k=nex[k]; nex[++i]=++k; } } int main() { int tcase=1; while(~scanf("%d",&n)) { if(n==0) break; scanf("%s",str); getnext(); printf("Test case #%d ",tcase); for(int i=2;i<=n;i++) { int k=i-nex[i]; if(i%k==0&&nex[i]) { int kk=i/k; printf("%d %d ",i,kk); } } printf(" "); tcase+=1; } }
hdu 1711
#include<stdio.h> #include<iostream> #include<algorithm> using namespace std; const int max_=1e6+5; int a[max_],b[max_]; int nex[max_]; void getnext(int n) { int k=-1,i=0; nex[0]=-1; while(i<n) { while(k>-1&&b[i]!=b[k]) k=nex[k]; nex[++i]=++k; } } int solve(int n,int m) { int i=0,j=0; while(i<n&&j<m) { while(j!=-1&&a[i]!=b[j]) j=nex[j]; i++,j++; } if(j==m) return i-j+1; else return -1; } int main() { int t; scanf("%d",&t); while(t--) { int n,m; scanf("%d %d",&n,&m); for(int i=0;i<n;i++) { scanf("%d",&a[i]); } for(int i=0;i<m;i++) { scanf("%d",&b[i]); } getnext(m); printf("%d ",solve(n,m)); } }
hdu 1686
#include<stdio.h> #include<iostream> #include<algorithm> #include<string.h> using namespace std; const int max_=1e6+5; char str[max_],mo[max_]; int nex[max_]; void getnext(int n) { int i=0,k=-1; nex[0]=-1; while(i<n) { while(k>-1&&mo[k]!=mo[i]) k=nex[k]; nex[++i]=++k; } } int solve(int n,int m) { int i=0,j=0,ans=0; while(i<n) { while(j>-1&&mo[j]!=str[i]) j=nex[j]; i++,j++; if(j==m) ans+=1; } return ans; } int main() { int t; scanf("%d ",&t); while(t--) { gets(mo); gets(str); getnext(strlen(mo)); printf("%d ",solve(strlen(str),strlen(mo))); } }
hdu 2087
#include<stdio.h> #include<iostream> #include<algorithm> #include<string.h> using namespace std; const int max_=1e6+5; char str[max_],mo[max_]; int nex[max_]; void getnext(int n) { int i=0,k=-1; nex[0]=-1; while(i<n) { while(k>-1&&mo[k]!=mo[i]) k=nex[k]; nex[++i]=++k; } } int solve(int n,int m) { int i=0,j=0,ans=0; while(i<n) { while(j>-1&&mo[j]!=str[i]) j=nex[j]; i++,j++; if(j==m) { ans+=1; j=0; } } return ans; } int main() { while(scanf("%s",str)) { if(str[0]=='#') break; scanf("%s",mo); getnext(strlen(mo)); printf("%d ",solve(strlen(str),strlen(mo))); } }
hdu 3746
#include<stdio.h> #include<iostream> #include<algorithm> #include<string.h> using namespace std; const int max_=1e+5; int nex[max_]; char str[max_]; void getnext(int n) { int i=0,k=-1; nex[0]=-1; while(i<n) { while(k>-1&&str[i]!=str[k]) k=nex[k]; nex[++i]=++k; } } int solve(int n) { if(!nex[n]) return n; else { int k=n-nex[n]; if(n%k==0) return 0; return k-(n%k); } } int main() { int t; scanf("%d ",&t); while(t--) { gets(str); int len=strlen(str); getnext(len); printf("%d ",solve(len)); } }
poj 2406
#include<stdio.h> #include<iostream> #include<algorithm> #include<string.h> using namespace std; const int max_=1e6+5; char str[max_]; int nex[max_]; void getnext(int n) { int i=0,k=-1; nex[0]=-1; while(i<n) { while(k>-1&&str[k]!=str[i]) k=nex[k]; nex[++i]=++k; } } int solve(int n) { int k=n-nex[n]; if(n%k) return 1; return n/k; } int main() { while(gets(str)) { if(str[0]=='.') break; int len=strlen(str); getnext(len); printf("%d ",solve(len)); } }