POJ 2752
来源:互联网 发布:vb和c语言哪个难 编辑:程序博客网 时间:2024/05/22 17:26
#include<iostream>using namespace std;const int MAX=400005;char s[MAX];int tmp[MAX];int len[MAX];char substr[MAX];void GetNext(char* p,int next[]) { int pLen = strlen(p); next[0] = -1; int k = -1; int j = 0; while (j < pLen) { //p[k]表示前缀,p[j]表示后缀 if (k == -1 || p[j] == p[k]) { ++k; ++j; next[j] = k; } else { k = next[k]; } } } int main(){ while(scanf("%s",s)!=EOF){int count=0;GetNext(s,tmp);int sLen=strlen(s);int n=sLen;while(tmp[n]!=0){n=tmp[n];len[count]=n;count++;}for(int i=0;i<count;i++)printf("%d ",len[count-i-1]);printf("%d\n",sLen);//整个字符是符合前缀后缀}}
思路如下:
k=next[i]:表示 p[0..i-1]的最长后缀前缀是k,即p[0..k-1].
所以,对字符串S计算出其next数组,GetNext(s,tmp);
int sLen=strlen(s);
从next[sLen]开始算起,即k=next[sLen],表示
p[0..sLen-1]的前缀后缀长度是k.
然后继续迭代
k=next[k];
因为比如说s="abc",那么"abc"会是s的前缀后缀,所以
printf("%d\n",sLen);//整个字符是符合前缀后缀
0 0
- POJ 2752
- poj 2752
- poj 2752
- POJ 2752
- poj 2752
- POJ 2752
- poj(2752)
- POJ 2752
- poj 2752
- POJ 2752
- poj 2752
- POJ-2752
- POJ 2752
- POJ-2752
- poj 2752
- Poj 2752
- poj 2752
- POJ 2752
- Android软件开发之盘点所有Dialog对话框大合集(一)
- USACO: Superprime Rib
- 第14周上机实践项目1——折腾二维数组(1)
- 正面面对
- C++学习笔记:类的构造函数
- POJ 2752
- 我使用过的Linux命令之ifconfig - 网络配置命令
- Python学习笔记(3)
- QT界面鼠标双击事件相应
- 多线程服务器编程模型
- Java内存管理的进一步理解-模拟过程图解
- Hadoop-2.4.1学习之ResourceManager重启
- 使用SWO来替代串口实现Printf打印功能
- javascript(js)放在head和body的区别