- //next 数组求法
- void GetNextval(char* p, int next[])
- {
- int pLen = strlen(p);
- next[0] = -1;
- int k = -1;
- int j = 0;
- while (j < pLen - 1)
- {
- //p[k]表示前缀,p[j]表示后缀
- if (k == -1 || p[j] == p[k])
- {
- ++j;
- ++k;
- if (p[j] != p[k])
- next[j] = k;
- else
- next[j] = next[k];
- }
- else
- {
- k = next[k];
- }
- }
- }
- int KmpSearch(char* s, char* p)
- {
- int i = 0;
- int j = 0;
- int sLen = strlen(s);
- int pLen = strlen(p);
- while (i < sLen && j < pLen)
- {
- //①如果j = -1,或者当前字符匹配成功(即S[i] == P[j]),都令i++,j++
- if (j == -1 || s[i] == p[j])
- {
- i++;
- j++;
- }
- else
- {
- //②如果j != -1,且当前字符匹配失败(即S[i] != P[j]),则令 i 不变,j = next[j]
- //next[j]即为j所对应的next值
- j = next[j];
- }
- }
- if (j == pLen)
- return i - j;
- else
- return -1;
- }
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
int next[111];
char s[111],p[111];
int getnext(char *p)
{
int j=0;
int k=-1;
next[0]=-1;
while(j<strlen(p)-1)
{
if(k==-1||p[j]==p[k])
{
k++;
j++;
if(p[j]!=p[k])
next[j]=k;
else
next[j]=next[k];
}
else
k=next[k];
}
}
int kmp(char *s, char *p)
{
int len1 = strlen(s);
int len2 = strlen(p);
int i=0,j=0;
while(j<len2 && i<len1)
{
if(p[j]==s[i]||j==-1)
{
i++;
j++;
}
else
{
j=next[j];
}
}
if(j==len2)
return i-j;
else
return -1;
}
int main()
{
int i,j,k,l;
while(cin>>s>>p)
{
getnext(p);
k=kmp(s,p);
cout << k << endl;
}
return 0;
}