首页 > 其他 > 详细

POJ 2752 (KMP)

时间:2015-07-15 22:23:16      阅读:230      评论:0      收藏:0      [点我收藏+]

题目链接:http://poj.org/problem?id=2752

题意:给一个字符串,判断前缀和后缀是相同的位置,把这些位置从小到大输出出来。

题解:通过字符串得到next数组,然后从next[len]开始。其值就是最后一个是相同前缀后缀的位置,然后,i=next[i],就是不断的向前找,就匹配了过去。

 

代码如下:

技术分享
 1 #include<cstdio>
 2 #include<iostream>
 3 #include<algorithm>
 4 #include<cstring>
 5 #include<string>
 6 using namespace std;
 7 const int maxn=1000005;
 8 int Next[maxn];
 9 char s[maxn];
10 int sum[maxn];
11 void getNext(int len)
12 {
13     int i=0,j=-1;
14     Next[0]=-1;
15     while(i<len)
16     {
17         if(j==-1||s[i]==s[j])
18         {
19             i++;
20             j++;
21             Next[i]=j;
22         }
23         else
24             j=Next[j];
25     }
26 }
27 int main()
28 {
29     int t;
30     int temp=1;
31     while(~scanf("%s",s))
32     {
33         int l=strlen(s);
34         getNext(l);
35         int k=l-Next[l];
36         temp=1;
37         
38         for(int i=l;i>=1;)
39         {
40             sum[temp++]=Next[i];
41             i=Next[i];
42         }
43         for(int i=temp-1;i>=1;i--)
44             if(sum[i])
45             printf("%d ",sum[i]);
46         printf("%d\n",l);
47     }
48 }
View Code

 

POJ 2752 (KMP)

原文:http://www.cnblogs.com/ikids/p/4649474.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!