码迷,mamicode.com
首页 > 其他好文 > 详细

POJ 2752 (KMP)

时间:2015-07-15 22:23:47      阅读:103      评论: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
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!