POJ2752KMP逆序处理
2015-06-04 16:39
393 查看
题意:
给你一个串,问你都哪些位置即使前缀又是后缀。
思路:
可以用KMP来做,尝试过很多种方法,想把两个串接起来然后..失败,后来又想可以倒着匹配,就是把整个串倒过来..失败,说下第三种也是成功的方法,就是正常匹配,然后找到最后一个的next,如果是0,那么就不用找了,否则里面的数值是答案,然后再找next对应的那个数值,一直找到0,最后记得把总长度加上,正确性可以这么想,从后往前找保证是后缀,不是0保证当前失配不用返回起点也就是当前是当前是某个和前缀相同但不是前缀的字符串的最后一个字母。
给你一个串,问你都哪些位置即使前缀又是后缀。
思路:
可以用KMP来做,尝试过很多种方法,想把两个串接起来然后..失败,后来又想可以倒着匹配,就是把整个串倒过来..失败,说下第三种也是成功的方法,就是正常匹配,然后找到最后一个的next,如果是0,那么就不用找了,否则里面的数值是答案,然后再找next对应的那个数值,一直找到0,最后记得把总长度加上,正确性可以这么想,从后往前找保证是后缀,不是0保证当前失配不用返回起点也就是当前是当前是某个和前缀相同但不是前缀的字符串的最后一个字母。
#include<stdio.h> #include<string.h> char str[400005]; int next[400005]; int ans[400005]; void Get_Next(int m) { int j = 0 ,k = -1; next[0] = -1; while(j < m) { if(k == -1 || str[j] == str[k]) next[++j] = ++k; else k = next[k]; } return ; } int main () { int m ,i; while(~scanf("%s" ,str)) { m = strlen(str); Get_Next(m); int id = m; i = 0; while(next[id]) { ans[++i] = next[id]; id = next[id]; } ans[0] = m; m = i; for(i = m ;i >= 0 ;i --) { if(!i) printf("%d\n" ,ans[i]); else printf("%d " ,ans[i]); } } return 0; }
相关文章推荐
- 关于Class.getResource和ClassLoader.getResource的路径问题
- ecshop的订单状态
- linux下tomcat开机启动配置
- 周记:适配心得
- poj2987最大权闭包(输出最少建塔个数)
- UIAlertView以及UIAlertController
- JS网站右下角悬浮视窗可关闭广告
- MySQL事物系列:1:事物简介
- java的clone
- 以一个权限系统来告别WebForm —开篇
- 由浅入深学习ajax跨域(JSONP)问题
- C#对html的操作
- select函数简介
- MFC 将文本框内容转为十六进制的字符串
- Android TargetApi注释使用
- Eclipse环境配置
- linux 定时任务 加锁
- 协议栈----资料收集整理消化吸收---阿冬专栏
- Android底层开发(二)之编写调用JNI层的java库 第四步
- java中synchronized的用法与详解