KMP

KMP,精妙,前后看了3次,到现在终于弄懂了,网上的各种模版很杂,错的也不少,自己写了个。。。
最妙的是next数组的运用,PKU上不少题是不用kmp()函数而巧妙运用next[]数组的。。。
getnext()实际也是一个自身的KMP匹配,怎一个妙字了得~ 广为流传的求法实在是精练,一字不改地照搬了~~
 1#include<stdio.h>
 2#include<string.h>
 3
 4int next[255];
 5char m[255],s[255];
 6int cnt,res[255];
 7
 8void 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
22void 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
47int 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到现在了:-(   。。。

posted on 2007-11-08 21:03 Amigo 阅读(327) 评论(0)  编辑 收藏 引用


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


<2007年11月>
28293031123
45678910
11121314151617
18192021222324
2526272829301
2345678

导航

统计

常用链接

留言簿(4)

随笔档案

搜索

积分与排名

最新评论

阅读排行榜

评论排行榜