POJ3461Oulipo[KMP]

来源:互联网 发布:淘宝商品链接提取 编辑:程序博客网 时间:2024/06/15 23:46

题目大意
给你两个字符串,给出第一个在第二个字符串中的出现次数,注意,有多组数据。
Time Limit: 1000MS Memory Limit: 65536K
经典KMP(貌似不是的)题目,十分容易。

#include <cstdio>#include <cstring>using namespace std;int t,i,j,next[1000010],ans,l1,l2;char s1[1000010],s2[100010];int main(){    scanf("%d",&t);    while(t--){        scanf("%s%s",&s2,&s1);        l1=strlen(s1);        l2=strlen(s2);        i=0;        j=-1;        next[0]=-1;        while(i!=l2)//初始化,计算next函数值            if(j==-1||s1[i]==s1[j])                next[++i]=++j;            else                j=next[j];        i=0;j=0;ans=0;        while(i!=l1&&j!=l2){//KMP套算法就行了            if(j==-1||s1[i]==s2[j]){                i++;                j++;            }            else                j=next[j];            if(j==l2){                ans++;                j=next[j];            }        }        printf("%d\n",ans);    }    return 0;}
1 0