博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
poj 2752 - Seek the Name, Seek the Fame
阅读量:6681 次
发布时间:2019-06-25

本文共 1344 字,大约阅读时间需要 4 分钟。

还是KMP,我觉得应该把自己的心得写一下。这题要求的是“前后辍”,即既是前辍又是后辍,比如“abcab”中的“ab”。KMP求next数组有两种算法,一种是:

if(t[i] == t[j])

{ i++; j++; next[i] = j; }

另一种是:

if(t[i] == t[j])

{ i++; j++;

  if(t[i] != t[j])

    next[i] = j;

  else

    next[i] = next[j];

}

第二种是第一种的改进版,不过这一题恰恰是第一种比较合适。对字串“ababcabab”来说,两种方法构造的next分另为:

a b a b c a b a b  
-1 0 -1 0 2 -1 0 -1 0 4
-1 0 0 1 2 0 1 2 3

4

 

 

 

 

 

在文中插表格太麻烦,我就做成这样了。上一行是第二种,下一行是第一种方法,从左到右分别为next[0]到next[10],第一种方法的数组满足这样的性质:对任意 i ,next[i] = j 表示字串中前 i 个字符组成的子串的最长“前后辍”长度为 j 。比如,‘c’ 对应着next[4] = 2,那么前4个字符“abab” 的最长前后辍“ab”的长度为2。这样就好办多了,“ababcabab” 的最长串为“abab”,“abab”的最长串为“ab”,递归打印就行了。

1 #include 
2 #include
3 int next[1000005],len; 4 char T[1000005]; 5 void getnext(char *t) 6 { 7 int i=0,j=-1; 8 len = strlen(T); 9 next[0] = -1;10 while(i < len)11 if(j == -1 || T[i]==T[j])12 {13 i++;j++;14 next[i] = j;15 }16 else j = next[j];17 }18 void show(int a)19 {20 if(next[a])21 show(next[a]),22 printf(" %d",a);23 else printf("%d",a);24 }25 int main()26 {27 while(~scanf("%s",T))28 {29 getnext(T);30 show(len);31 printf("\n");32 }33 return 0;34 }

 

PS:刚刚才发现,第二种数组虽不对任意 i 满足上述性质,但是在这一题相应的位置上是满足的,晕死,那不就是两种都可以了。

转载于:https://www.cnblogs.com/lzxskjo/archive/2012/05/05/2484670.html

你可能感兴趣的文章
如何对Redis设置密码,提高安全性
查看>>
cognos如何制作维表左关联事实表的报表
查看>>
Android基础(五) – Service生命周期及启动方式
查看>>
Nginx反向代理后端多节点下故障节点的排除思路
查看>>
error: No curses/termcap library found
查看>>
android之shape使用
查看>>
Java八大基本数据类型
查看>>
yum安装JDK
查看>>
C#中Dictionary的用法及用途
查看>>
BizTalkServer 如何接收 EDI 消息(7)
查看>>
我的友情链接
查看>>
我的友情链接
查看>>
初出茅庐
查看>>
起航--dream
查看>>
c语言学习记录--求出1000以内所有完数,并输出其因子
查看>>
cisco nat配置
查看>>
配置YUM服务器[(图文)附禁ROOT方法]
查看>>
实例ansible-role :通过role进行二进制批量部署mariadb从而批量上线sql系统
查看>>
思科交换机镜像端口介绍配置
查看>>
独家揭秘语音视频聊天室开发顶尖制作教程
查看>>