KMP,精妙,前后看了3次,到现在终于弄懂了,网上的各种模版很杂,错的也不少,自己写了个。。。
最妙的是next数组的运用,PKU上不少题是不用kmp()函数而巧妙运用next[]数组的。。。
getnext()实际也是一个自身的KMP匹配,怎一个妙字了得~ 广为流传的求法实在是精练,一字不改地照搬了~~
1
#include<stdio.h>
2
#include<string.h>
3
4
int next[255];
5
char m[255],s[255];
6
int cnt,res[255];
7
8
void getnext()
9
{
10
int i,j;
11
i=0;j=-1;
12
next[0]=-1;
13
while(s[i])
14
{
15
if(j==-1||s[i]==s[j])
16
next[++i]=++j;
17
else
18
j=next[j];
19
}
20
}
21
22
void kmp()
23
{
24
int i,j,len1,len2;
25
i=0;j=0;
26
len1=strlen(m);
27
len2=strlen(s);
28
while(i<len1)
29
{
30
while(j!=len2&&m[i]==s[j])//找到当前第一个失配字符
31
{
32
i++;
33
j++;
34
}
35
if(j==0)//第一个字符失配
36
i++;
37
else if(j==len2)//找到一个匹配串
38
{
39
res[cnt++]=i-j;
40
j=next[j];
41
}
42
else//回朔
43
j=next[j];
44
}
45
}
46
47
int main()
48
{
49
freopen("in.txt","r",stdin);
50
scanf("%s%s",m,s);
51
// m[]="aabbbabaabbaaabbaabbaabbaabbaabbaa",s[]="aabbaabb";
52
cnt=0;
53
getnext();
54
kmp();
55
return 0;
56
}
这两天做了好多KMP:PKU3080,PKU3461,PKU2406,PKU2752
还有恶心的3450,WA到现在了:-( 。。。