KMP

来源:互联网 发布:跪求十宗罪网络剧种子 编辑:程序博客网 时间:2024/04/29 05:17
#include <iostream>using namespace std;void set_next(int* next, char *s){    int k, j;    int len = strlen(s);    next[0] = -1;    for(k=1; k<len; k++)    {        j = k-1;        while(1)        {            if(next[j] == -1)            {                if(s[k] == s[j])                    next[k] = -1;                else                    next[k] = 0;                break;            }            if(s[j] == s[next[j]])            {                next[k] = next[j] + 1;                break;            }            j = next[j];        }    }}int str_find(char *s1, char *s2){    if(s1==NULL || s2==NULL)        return -1;    int len1 = strlen(s1);    int len2 = strlen(s2);    int i,j;    int *next = new int[len2];    set_next(next, s2);    i=j=0;    while(i<len1 && j<len2)    {        if(j==-1 || s1[i]==s2[j])        {            i++;j++;        }        else            j = next[j];    }    if(j==len2)        return i-len2;    else        return -1;}int main(){    int pos;    char s1[100];    char s2[100];    while(1)    {        cin>>s1>>s2;        pos = str_find(s1, s2);        cout<<pos<<endl;    }    return 0;}