poj 2752
#include<stdio.h> #include<iostream> #include<algorithm> #include<string.h> using namespace std; const int max_=4e5+5; char str[max_]; int ans[max_],nex[max_]; int tot; 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; } } void solve(int n) { int i=n; tot=0; while(i>-1) { if(str[i-1]==str[n-1]) ans[++tot]=i; i=nex[i]; } } int main() { while(gets(str)) { int len=strlen(str); getnext(len); solve(len); for(int i=tot;i>=1;i--) { printf("%d ",ans[i]); } printf(" "); } }
poj 3080
#include<stdio.h> #include<iostream> #include<algorithm> #include<string.h> #include<string> using namespace std; const int N=10+5,max_=60+5; string s[N]; int nex[max_]; void getnext(string str) { int n=str.size(); int i=0,k=-1; nex[i]=k; while(i<n) { while(k>-1&&str[i]!=str[k]) k=nex[k]; nex[++i]=++k; } } bool kmp(string str,string mo) { int n=str.size(),m=mo.size(); int i=0,j=0; while(i<n&&j<m) { while(str[i]!=mo[j]&&j>-1) j=nex[j]; i++,j++; } if(j==m) return 1; return 0; } int main() { ios::sync_with_stdio(false); int t; cin>>t; while(t--) { int n; cin>>n; for(int i=0;i<n;i++) cin>>s[i]; string ans=""; for(int j=1;j<=s[0].size();j++) { for(int i=0;i+j<=s[0].size();i++) { bool flag=0; string op=s[0].substr(i,j); getnext(op); for(int ii=1;ii<n;ii++) { if(kmp(s[ii],op)==0) { flag=1; break; } } if(!flag) { if(ans.size()<op.size()) ans=op; else if(ans.size()==op.size()) ans=min(ans,op); } } } if(ans.size()>=3) cout<<ans<<endl; else cout<<"no significant commonalities"<<endl; } }
hdu 2594
#include<stdio.h> #include<algorithm> #include<iostream> #include<string.h> const int max_=5e5+5; using namespace std; char str[max_],mo[max_]; int nex[max_]; void getnext(int n) { int i=0,k=-1; nex[i]=-1; while(i<n) { while(str[i]!=str[k]&&k>-1) k=nex[k]; nex[++i]=++k; } } void solve(int n,int m) { int i=0,j=0; while(j<m) { while(str[i]!=mo[j]&&i>-1) i=nex[i]; i++,j++; // printf("%d ",j); } if(i<=0) printf("0 "); else { for(int ii=0;ii<i;ii++) printf("%c",str[ii]); printf(" %d ",i); } } int main() { while(scanf("%s %s",str,mo)!=EOF) { // cout<<str<<endl<<mo<<endl; int n=strlen(str); int m=strlen(mo); getnext(n); solve(n,m); } }