标签:
与上题不同的是:
在ans++; 后,要同时把j=0;
因为这道找出来的子序列不允许重叠,2个子序列要是重叠只能取其一嘛。
1 #include<cstdio> 2 #include<cstring> 3 const int max=1000+10; 4 char p[max]; 5 char t[max]; 6 int f[max]; 7 int ans; 8 void getfail() 9 { 10 int m=strlen(p); 11 f[0]=f[1]=0; 12 for(int i=1;i<m;i++){ 13 int j=f[i]; 14 while(j&&p[j]!=p[i]) 15 j=f[j]; 16 f[i+1]=p[j]==p[i]?j+1:0; 17 } 18 } 19 void kmp() 20 { 21 int n=strlen(t); 22 int m=strlen(p); 23 int j=0; 24 for(int i=0;i<n;i++){ 25 while(j&&p[j]!=t[i]) 26 j=f[j]; 27 if(p[j]==t[i]) 28 j++; 29 if(j==m){ 30 ans++; 31 j=0; 32 } 33 } 34 } 35 int main() 36 { 37 while(true){ 38 scanf("%s",&t); 39 if(t[0]==‘#‘) 40 break; 41 scanf("%s",&p); 42 ans=0; 43 kmp(); 44 printf("%d\n",ans); 45 } 46 return 0; 47 }
标签:
原文地址:http://www.cnblogs.com/-maybe/p/4307262.html