才学了KMP,拿这题来练练手……(不过似乎有点小题大做了……
这就是一题水水的KMP模板,匹配若干次,每一次从上次匹配后的位置开始,直到匹配失败。
虽然用的算法“高级”一点,但是居然比暴力慢了40MS啊啊啊……
Code:
1 #include<iostream> 2 using namespace std; 3 const int P=15; 4 const int S=1000005; 5 char p[P],s[S]; 6 int next[P],pl,sl; 7 void getnext(){ 8 next[0]=-1; 9 int i=0,j=-1; 10 while(i<pl){ 11 if(j==-1||s[i]==s[j]){ 12 i++,j++; 13 next[i]=j; 14 }else{ 15 j=next[j]; 16 } 17 } 18 } 19 int KMP(int st){ 20 int i=st,j=0; 21 while(i<sl&&j<pl){ 22 if(j==-1||s[i]==p[j]){ 23 i++,j++; 24 }else{ 25 j=next[j]; 26 } 27 } 28 return j==pl?(i-j):-1; 29 } 30 int main() 31 { 32 freopen("stat.in","r",stdin); 33 freopen("stat.out","w",stdout); 34 int i,x,ans=0,flag=0,loc; 35 gets(p); 36 gets(s); 37 pl=strlen(p); 38 sl=strlen(s); 39 for(i=0;i<sl;i++)s[i]=tolower(s[i]); 40 for(i=0;i<pl;i++)p[i]=tolower(p[i]); 41 getnext(); 42 for(x=KMP(0);x!=-1;x=KMP(x+pl)){ 43 if((x==0||s[x-1]==‘ ‘)&&(x+pl>=sl||s[x+pl]==‘ ‘)){ 44 if(flag==0){ 45 flag=1; 46 loc=x; 47 } 48 ans++; 49 } 50 } 51 if(flag) 52 cout<<ans<<‘ ‘<<loc; 53 else 54 cout<<-1; 55 return 0; 56 }
时间: 2024-10-16 05:12:00