Period HDU
来源:互联网 发布:辽宁北方频道网络直播 编辑:程序博客网 时间:2024/06/14 02:28
PeriodHDU - 1358
For each prefix of a given string S with N characters (each character has an ASCII code between 97 and 126, inclusive), we want to know whether the prefix is a periodic string. That is, for each i (2 <= i <= N) we want to know the largest K > 1 (if there is one) such that the prefix of S with length i can be written as AK , that is A concatenated K times, for some string A. Of course, we also want to know the period K.
3aaa12aabaabaabaab0
Test case #12 23 3Test case #22 26 29 312 4
#include <iostream>#include <cstdio>#include <cstring>using namespace std;int Next[1010000];char a[1010000];void getNext(){ int i = -1,j = 0;//两个下标错开 Next[0] = -1;//第一个初始化为-1 int lena = strlen(a);//求出字符串长度 while(j < lena){ if(i==-1||a[i]==a[j]){ i++,j++; //if(a[i]==a[j])Next[j] = Next[i];//优化 Next[j] = i;//注意注意!!因为这里是单纯的找前缀中最长的前后缀相同长度,所以不能进行优化,优化长度就改变了 } else i = Next[i]; }}int main(){ int n; int i,j; int num = 0; while(~scanf("%d",&n)&&n){ scanf("%s",a); getNext(); printf("Test case #%d\n",++num); for(i = 1; i <= n; i++){ int temp = i-Next[i];//这句话求循环节的长度,仔细想想你会发现,如果不循环,那么i-Next[i]的值肯定大于前缀总长度的一般,而如果循环肯定小于等于一半 if(i%temp==0&&i/temp>1){//能整除说明是周期字符串,并且题目要求周期大于1 printf("%d %d\n",i,i/temp); } } printf("\n"); } return 0;}
阅读全文
0 0
- hdu Period
- Period HDU
- HDU 1358 Period (KMP)
- HDU 1358 Period
- hdu 1358 Period
- hdu 1358 Period
- hdu 1358 Period
- HDU 1358 Period KMP
- hdu 1358 Period
- hdu 1358 Period KMP
- hdu 1358 Period(KMP)
- HDU 1358 Period KMP
- hdu 1358 Period
- hdu 1358 Period
- 【HDU】1358 Period KMP
- HDU - 1358 Period
- HDU 1358 Period (KMP)
- HDU 1358 Period
- 关于maven配置
- 基于Hexo+Github构建个人博客(一)
- JavaScript 字符串,String对象
- [leetcode] 646. Maximum Length of Pair Chain
- 关于cesium的3dTiles数据的理解
- Period HDU
- 异常处理
- 如何判断一个数二进制中“1”的个数
- C/C++ 面向对象和面向过程区别
- 解决@Scheduled注解定时任务并发执行
- java 实现二叉树原理
- am5728开始。。。
- linux下导入、导出mysql数据库命令
- 拥抱迷茫