题目链接:http://acm.fzu.edu.cn/problem.php?pid=1901

题目大意:题目大意求出所有p满足s[i]=s[i+p](i<=len-p)

解题思路:

其实就是要找出所有的循环节(不只是最小的),
循环节本质跟公共前后缀有关,可以通过递归的方法求出所有公共前后缀ti,那么len-ti就是相应循环节。

之前写的计算最小循环节,累加循环节得到前缀的方法是有问题的,过不了下面这种数据。
数据:abacaba
结果应该是4,6,7
而求出来的是4,7。因为忽略了除了最小循环节外的其他循环节。

代码

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<algorithm>
  5. using namespace std;
  6. const int N=1e6+;
  7.  
  8. int len;
  9. int nxt[N],ans[N];
  10. char p[N];
  11.  
  12. void getnext(){
  13. int i=,j=nxt[]=-;
  14. while(i<len){
  15. while(j!=-&&p[i]!=p[j])
  16. j=nxt[j];
  17. nxt[++i]=++j;
  18. }
  19. }
  20.  
  21. int main(){
  22. int t,cas=;
  23. scanf("%d",&t);
  24. while(t--){
  25. scanf("%s",p);
  26. len=strlen(p);
  27. getnext();
  28. int t=nxt[len];
  29. int cnt=;
  30. while(t!=-){
  31. if(t>=) ans[cnt++]=len-t;
  32. t=nxt[t];
  33. }
  34. printf("Case #%d: %d\n",++cas,cnt);
  35. for(int i=;i<cnt;i++){
  36. printf("%d%c",ans[i],i==cnt-?'\n':' ');
  37. }
  38. }
  39. return ;
  40. }

FZU 1901 Period II(KMP循环节+公共前后缀)的更多相关文章

  1. FZU - 1901 Period II(kmp所有循环节)

    Problem Description For each prefix with length P of a given string S,if S[i]=S[i+P] for i in [0..SI ...

  2. [FZU 1901]Period II KMP

    For each prefix with length P of a given string S,if S[i]=S[i+P] for i in [0..SIZE(S)-p-1], then the ...

  3. Fzu Problem 1901 Period II (kmp)

    题目链接: Problem 1901 Period II 题目描述: 给出一个串,满足长度为p的前缀和长度为p的后缀相等的p的个数,输出p的个数,和p分别是多少? 解题思路: 对kmp的next数组的 ...

  4. 【kmp+求所有公共前后缀长度】poj 2752 Seek the Name, Seek the Fame

    http://poj.org/problem?id=2752 [题意] 给定一个字符串,求这个字符串的所有公共前后缀的长度,按从小到达输出 [思路] 利用kmp的next数组,最后加上这个字符串本身 ...

  5. FZU - 1901 Period II (kmp)

    传送门:FZU - 1901 题意:给你个字符串,让你求有多少个p可以使S[i]==S[i+P] (0<=i<len-p-1). 题解:这个题是真的坑,一开始怎么都觉得自己不可能错,然后看 ...

  6. FZU 1901 Period II(KMP中的next)题解

    题意:给你一串字符串,问你前后缀相同情况有几种,并输出后缀位置(?这里一直没看懂length是什么,但是这样理解答案也对,然后还要加上本身长度) 思路:这里好好讲讲next的用法.我们都知道next代 ...

  7. POJ 2752 (kmp求所有公共前后缀长度)

    <题目链接> <转载于> 题目大意:  给出一个字符串str,求出str中存在多少子串,使得这些子串既是str的前缀,又是str的后缀.从小到大依次输出这些子串的长度.即输出该 ...

  8. FZU1901 Period II —— KMP next数组

    题目链接:https://vjudge.net/problem/FZU-1901  Problem 1901 Period II Accept: 575    Submit: 1495Time Lim ...

  9. HDU 2594(求最长公共前后缀 kmp)

    题意是在所给的两个字符串中找最长的公共前后缀,即第一个字符串前缀和第二个字符串后缀的最长相等串. 思路是将两个字符串拼接在一起,然后直接套用 kmp 算法即可. 要注意用 next 会报编译错误,改成 ...

随机推荐

  1. bzoj4427【Nwerc2015】Cleaning Pipes清理管道

    题目描述 Linköping有一个相当复杂的水资源运输系统.在Linköping周围的出水点有一些水井.这些水通过管道输送到其它地点.每条管道是从某一个水井到城市的某个位置的直线管道. 所有管道在地下 ...

  2. 《剑指offer》— JavaScript(15)反转链表

    反转链表 题目描述 输入一个链表,反转链表后,输出链表的所有元素. *** 思路 (本题链表默认无头结点) pHead为当前结点,如果当前结点为空的话,直接返回: pHead为当前结点,pre为当前结 ...

  3. 勉励自己--淡定的CrazyDog

    明天就要靠六级,今天只是背了一篇作文,做了两篇阅读,收获很小啊,但是要求自己一定要写,博客,我就把自己背的作文模板写成日记好了(纯手打) Relationship Between Major and ...

  4. ssh或scp自动化问题

    http://note.youdao.com/noteshare?id=1ac4cb9469f818dbe579d721aae4e914

  5. C++下实现同接口下多个类作为参数的调用和传参

    /* 实现同接口下不同类的对象的转移 定义类的接口 定义多个继承该接口的类 定义管理类,把接口当作类型, 传入该接口下各种类的对象,进行操作 */ #include<iostream> # ...

  6. linux查看tomcat日志

    声明:以上内容均为转载,个人对这块知识搜罗之后放在一起,非原创,以后这块有问题还会继续添加. Tomcat 日志分为下面5类: catalina . 相当命令行输出日志 localhost . 相当于 ...

  7. 3.fIddler的使用

    https://blog.csdn.net/chaoyu168/article/details/51065644 https://blog.csdn.net/u013474436/article/de ...

  8. 20155325 2016-2017-2 《Java程序设计》第6周学习总结

    教材学习内容总结 分类 输入流&输出流 字节流&字符流 节点流&处理流 核心方法 Input Stream int read(byte[]b,int off,int len) ...

  9. 微信小程序开发教程(六)配置——app.json、page.json详解

    全局配置:app.json 微信小程序的全局配置保存在app.json文件中.开发者通过使用app.json来配置页面文件(pages)的路径.窗口(window)表现.设定网络超时时间值(netwo ...

  10. Django-Form表单(验证、定制、错误信息、Select)

      Django form 流程 1.创建类,继承form.Form 2.页面根据类的对象自动创建html标签 3.提交,request.POST       封装到类的对象里,obj=UserInf ...