码迷,mamicode.com
首页 > 编程语言 > 详细

noip2011普及组T2 统计单词数(stat) KMP算法

时间:2015-07-08 22:27:17      阅读:421      评论:0      收藏:0      [点我收藏+]

标签:

才学了KMP,拿这题来练练手……(不过似乎有点小题大做了……

这就是一题水水的KMP模板,匹配若干次,每一次从上次匹配后的位置开始,直到匹配失败。

虽然用的算法“高级”一点,但是居然比暴力慢了40MS啊啊啊……

Code:

 1 #include<iostream>
 2 using namespace std;
 3 const int P=15;
 4 const int S=1000005;
 5 char p[P],s[S];
 6 int next[P],pl,sl;
 7 void getnext(){
 8     next[0]=-1;
 9     int i=0,j=-1;
10     while(i<pl){
11         if(j==-1||s[i]==s[j]){
12           i++,j++;
13           next[i]=j;
14         }else{
15           j=next[j];
16         }
17     }
18 }
19 int KMP(int st){
20     int i=st,j=0;
21     while(i<sl&&j<pl){
22         if(j==-1||s[i]==p[j]){
23           i++,j++;
24         }else{
25           j=next[j];
26         }
27     }
28     return j==pl?(i-j):-1;
29 }
30 int main()
31 {
32     freopen("stat.in","r",stdin);
33     freopen("stat.out","w",stdout);
34     int i,x,ans=0,flag=0,loc;
35     gets(p);
36     gets(s);
37     pl=strlen(p);
38     sl=strlen(s);
39     for(i=0;i<sl;i++)s[i]=tolower(s[i]);
40     for(i=0;i<pl;i++)p[i]=tolower(p[i]);
41     getnext();
42     for(x=KMP(0);x!=-1;x=KMP(x+pl)){
43        if((x==0||s[x-1]== )&&(x+pl>=sl||s[x+pl]== )){
44          if(flag==0){
45            flag=1;
46            loc=x;
47          }
48          ans++;
49        }
50     }
51     if(flag)
52       cout<<ans<< <<loc;
53     else
54       cout<<-1;
55     return 0;
56 }

noip2011普及组T2 统计单词数(stat) KMP算法

标签:

原文地址:http://www.cnblogs.com/NOIRP/p/4631378.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!