KMP模板POJ3461-Oulipo
Posted Yiyi
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了KMP模板POJ3461-Oulipo相关的知识,希望对你有一定的参考价值。
【题意】
找出第一个字符串在第二个字符串中出现次数。
【注意点】
一定要先将strlen存下来,而不能每次用每次求,否则会TLE!
1 #include<iostream> 2 #include<cstdio> 3 #include<algorithm> 4 #include<cstring> 5 using namespace std; 6 const int MAXN=1000000+50; 7 const int MAXM=10000+50; 8 char t[MAXN],p[MAXN]; 9 int next[MAXM]; 10 int lent,lenp; 11 12 void getnext() 13 { 14 int i=0,j=-1; 15 next[i]=j; 16 while (i<lenp) 17 { 18 if (j==-1 || p[i]==p[j]) next[++i]=++j; 19 else j=next[j]; 20 } 21 } 22 23 int getans() 24 { 25 int i=0,j=0,ans=0; 26 while (i<lent) 27 { 28 if (t[i]==p[j] || j==-1) 29 { 30 i++; 31 j++; 32 } 33 else j=next[j]; 34 if (j==lenp)//如果匹配成功,则视作这次匹配失败,返回到上一次。 35 { 36 ans++; 37 j=next[j-1]; 38 i--; 39 } 40 } 41 return ans; 42 } 43 44 int main() 45 { 46 int kase; 47 scanf("%d",&kase); 48 for (int i=0;i<kase;i++) 49 { 50 scanf("%s%s",p,t); 51 lent=strlen(t); 52 lenp=strlen(p);//注意一定要先把strlen存下来,否则会TLE! 53 getnext(); 54 cout<<getans()<<endl; 55 } 56 return 0; 57 }
以上是关于KMP模板POJ3461-Oulipo的主要内容,如果未能解决你的问题,请参考以下文章