【无聊放个模板系列】POJ2752 EXKMP
1 #include<cstdio> 2 #include<cstdlib> 3 #include<cstring> 4 #include<iostream> 5 #include<algorithm> 6 #include<queue> 7 #include<cmath> 8 using namespace std; 9 #define Maxn 400010 10 11 char s[Maxn]; 12 int l,nt[Maxn]; 13 14 int mymin(int x,int y) {return x<y?x:y;} 15 16 void exkmp() 17 { 18 int mx=0,id=0; 19 nt[1]=l; 20 for(int i=2;i<=l;i++) 21 { 22 int k; 23 if(i<mx) k=mymin(nt[i-id+1],mx-i+1); 24 else k=0; 25 while(s[k+1]==s[i+k]&&i+k<=l) k++; 26 nt[i]=k; 27 if(i+nt[i]-1>mx) mx=i+nt[i]-1,id=i; 28 } 29 } 30 31 int main() 32 { 33 while(scanf("%s",s+1)!=EOF) 34 { 35 l=strlen(s+1); 36 exkmp(); 37 // for(int i=1;i<=l;i++) printf("%d ",nt[i]);printf("\n"); 38 for(int i=l;i>=1;i--) 39 { 40 if(nt[i]==l-i+1) printf("%d ",l-i+1); 41 } 42 printf("\n"); 43 } 44 return 0; 45 }
exkmp
2016-11-17 19:31:47
再来:
POJ 3461
1 #include<cstdio> 2 #include<cstdlib> 3 #include<cstring> 4 #include<iostream> 5 #include<algorithm> 6 #include<queue> 7 #include<cmath> 8 using namespace std; 9 #define Maxn 10010 10 #define Maxm 1000010 11 12 char s[Maxn],ss[Maxm]; 13 int l1,l2; 14 15 int nt[Maxn],td[Maxm]; 16 17 int mymin(int x,int y) {return x<y?x:y;} 18 19 void exkmp() 20 { 21 int mx=0,id=0; 22 for(int i=2;i<=l1;i++) 23 { 24 int k; 25 if(i<mx) k=mymin(nt[i-id+1],mx-i+1); 26 else k=0; 27 while(s[1+k]==s[i+k]&&i+k<=l1) k++; 28 nt[i]=k; 29 if(nt[i]+i-1>mx) mx=nt[i]+i-1,id=i; 30 } 31 // for(int i=2;i<=l1;i++) printf("%d ",nt[i]); 32 // printf("\n"); 33 34 mx=0,id=0; 35 for(int i=1;i<=l2;i++) 36 { 37 int k; 38 if(i<mx) k=mymin(nt[i-id+1],mx-i+1); 39 else k=0; 40 while(s[1+k]==ss[i+k]&&i+k<=l2&&1+k<=l1) k++; 41 td[i]=k; 42 if(i+td[i]-1>mx) mx=td[i]+i-1,id=i; 43 } 44 } 45 46 int main() 47 { 48 int T; 49 scanf("%d",&T); 50 while(T--) 51 { 52 scanf("%s%s",s+1,ss+1); 53 l1=strlen(s+1); 54 l2=strlen(ss+1); 55 exkmp(); 56 int ans=0; 57 for(int i=1;i<=l2;i++) if(td[i]==l1) ans++; 58 printf("%d\n",ans); 59 } 60 return 0; 61 }