KMP

#include<iostream>
#include<string.h>
using namespace std;
int next[1000];
char s[100],txt[100];
bool f;
void makenext(const char p[])
{
    int l,k=0,i;
    l=strlen(p);
    next[0]=0;
    for(i=1;i<l;i++)
    {
        while(k>0&&p[i]!=p[k])
            k=next[k-1];
        if(p[i]==p[k]) k++;
        next[i]=k;
    }
}
void kmp()
{
    makenext(s);
    int i,j=0,L=strlen(txt),l=strlen(s);
    for(i=0;i<l;i++) next[i]=i-next[i];
    next[0]=next[1]=1;
    for(i=0;i<L;)
    {
        if(txt[i]==s[j])
        {
            i++;
            j++;
        }
        else
        {
            i+=next[j];
            j=0;
        }
        if(j==l)
        {
            f=true;
            return;
        }
    }
}
int main()
{
    while(cin>>txt>>s)
    {
      f=false;
      kmp();
      if(f) cout<<"true"<<endl;
      else cout<<"false"<<endl;
    }
}

你可能感兴趣的:(KMP)