Oulipo

poj 3461

题目大意:啥都不说了,就是一个模式匹配

解决:KMP 刚开始一直wa,后来经同学提醒突然想到了溢出了,改了之后,一次就过了

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
char s[1000005],t[10005];
int next[10005],tlen,slen;
void getnext()
{
    int i=1,j=0;
    next[1]=0;
    while(i<=tlen)
    {//本来的模式匹配  i < tlen 就结束了,但是为了让模式串结束的时候继续比较,将最需要再添加一个,i=len的时候匹配的地方
        if(j==0 || t[i]==t[j])
        {
            i++;j++;
            if(t[i]!=t[j])
            next[i]=j;
            else next[i]=next[j];
        }
        else j=next[j];
    }
}
int kmp()
{
    int i=1,j=1,cnt=0;
    while(i<=slen)
    {
        if(j==0 || s[i]==t[j])
        {
             i++;j++;
            //当模式 串匹配成功的时候,j仍然可以退回到next[j]的位置,继续与主串比较
             if(j==tlen+1){ cnt++;  j=next[j]; } 
        }
        else j=next[j];
    }
    return cnt;
}
int main()
{
    int icase;
    scanf("%d",&icase);
    while(icase--)
    {
        scanf("%s%s",t+1,s+1);
       //就因为这个地方把长度存放到s[0],t[0]导致一直wa,原来是由于字符太长导致溢出,放到int中一下就ac了
        tlen=strlen(t+1);
        slen=strlen(s+1);
        getnext();
        printf("%d\n",kmp());
    }
    system("pause");
    return 0;
}

原文地址:https://www.cnblogs.com/hpustudent/p/2155818.html