hdu 2752 KMP(前后缀)
来源:互联网 发布:tbc数据库 编辑:程序博客网 时间:2024/06/04 19:33
题意:给出字符串,求所有既是前缀又是后缀的串的大小。
思路:KMP的next[]应用。。
例如题目给出的串 ababcababababcabab
对应的next值 -1,0,0,1,2,0,1,2,3,4,3,4,3,4,5,6,7,8,9(next[18])
next[18]=9,代表着位置18以前的既是前缀,又是后缀的串最大是9(不包括本身),然后找
next[9]=4,也就是位置9以前,有4个是前缀,并且和位置9向前数4个的字符串相同,因为位置9以前的字符串(9个)和位置18以前的9个字符串(也就是末尾的9个)相同,所以next[9]=4也代表了有4个字符串既是前缀也是后缀。同理,next[4]=2. next[2]=0,不再找了。。如果首字母等于尾字母,那么也算一个前后缀,数值等于1.
开一个数组tmp,把2,4,9,18(本身字符串大小,可以看作是最大的前后缀)存起来,然后循环输出即可。。
#include<iostream>using namespace std;int next[400005];char s[400005];int len;void get_next(){ int k=-1,j=0; next[0]=-1; len=strlen(s); while(j<len) { if(k==-1||s[j]==s[k]) { next[j+1]=k+1; j++;k++; } else k=next[k]; }}int main(){ int tmp[400005]; while(scanf("%s",s)!=EOF) { int i=1; get_next(); for(int g=0;g<=len;g++) printf("%d ",next[g]); int end=len; tmp[0]=len; while(next[len]!=0)//递归的找 { tmp[i++]=next[len]; len=next[len]; } if(s[0]==s[end]) printf("1 "); for(int j=i-1;j>0;j--) printf("%d ",tmp[j]); printf("%d\n",tmp[0]); }}
- hdu 2752 KMP(前后缀)
- [HDU 2594]Simpsons’ Hidden Talents[kmp求公共前后缀]
- HDU 4763 Theme Section(kmp求前后缀)
- POJ 2752 -kmp求所有公共前后缀长度
- HDU 3613 Best Reward(求前后缀回文 拓展KMP or Manacher)
- POJ 2752 Seek the Name, Seek the Fame [前后缀相同的KMP]
- hdu 4622 Reincarnation(后缀数组|后缀自动机|KMP)
- hdu2594 Simpsons’ Hidden Talents(KMP,前后缀)
- 字符串的前中后缀表达式,以及KMP算法。
- FZU 1901 KMP找前后缀等串
- HDU 2594 Simpsons’ HiddenTalents(KMP:后缀与前缀)
- HDU 3336 Count the string 后缀数组 或 (KMP + DP)
- HDU 4552 怪盗基德的挑战书 (KMP + DP) 或 后缀数组
- HDU 6153 A Secret(后缀转前缀+拓展KMP)
- HDU 5763Another Meaning (DP+KMP||后缀数组)
- hdu 3397 线段树前后缀blahblah Sequence operation
- HDU 6025 Coprime Sequence (前后缀+GCD)
- hdu 6096 AC 自动机 前后缀的巧妙应用
- hdu 1241 dfs 类似于(POJ水坑数)
- hdu 1198 dfs(还是水坑变型题)农田灌溉
- poj 2406 KMP应用
- hdu 1358 KMP
- hdu 1711 裸KMP
- hdu 2752 KMP(前后缀)
- poj 3461 KMP
- poj 3080 KMP+暴力
- poj 3450 KMP+暴力枚举(类似于3080)
- 组织行为学笔记:第十五章 组织中的个人
- 介绍一个可玩性蛮高的东西-路由器(附RG100AA-A的一点资料)
- 大三期末总结
- 【有上下界的网络流】
- Delphi XE Refactor重构功能简单说明