传送门:FZU - 1901

题意:给你个字符串,让你求有多少个p可以使S[i]==S[i+P] (0<=i<len-p-1)。

题解:这个题是真的坑,一开始怎么都觉得自己不可能错,然后看了别人的博客打脸了,发现自己掉坑了了...一开始想的是找出最小循环节,只要每次输出多加一个循环节,最后输出len就好了。后来发现最小循环节的倍数并不能表示所有循环节。看到的一组例子ababaaaabab,应该输出7,9,11;但是最小循环节的输出是7,11。

 1 #include<iostream>
2 #include<algorithm>
3 #include<string.h>
4 #include<queue>
5 using namespace std;
6
7 char a[1000100];
8 int nt[1000100];
9
10 void kmp_nt(int m)
11 {
12 int i,j;
13 i = 0;
14 nt[0] = j =-1;
15 while(i < m){
16 while(j!=-1&&a[i]!=a[j])
17 j = nt[j];
18 if(a[i]==a[j]||j==-1){
19 i++;
20 j++;
21 nt[i]=j;
22 }
23 }
24 }
25
26 int main()
27 {
28 int t;
29 cin>>t;
30 for(int i=1;i<=t;i++){
31 cin>>a;
32 cout<<"Case #"<<i<<": ";
33 int len=strlen(a);
34 kmp_nt(len);
35 queue<int>q;
36 int ans=nt[len];
37 while(ans>0){
38 q.push(ans);
39 ans=nt[ans];
40 }
41 cout<<q.size()+1<<endl;
42 while(!q.empty()){
43 cout<<len-q.front()<<' ';
44 q.pop();
45 }
46 cout<<len<<endl;
47 }
48 return 0;
49 }

最新文章

  1. taskkill批量删除进程命令
  2. Promiscuous Mode
  3. Jenkins_获取源码编译并启动服务(二)
  4. 强制重启N种方法
  5. C++文本的读取和写入
  6. APACHE重写去除入口文件index.php
  7. xampp访问403 Access forbidden 解决办法
  8. 史上最简单的个人移动APP开发入门--jQuery Mobile版跨平台APP开发
  9. hdu 4753 Fishhead’s Little Game 博弈论+记忆化搜索
  10. Linux 的启动流程
  11. 滑动菜单栏开源项目SlidingMenu的使用
  12. cocos2d-x实战 C++卷 学习笔记--第4章 使用菜单
  13. linux内核系列(一)编译安装Linux内核 2.6.18
  14. sql server 国内外 2个同步 ,加一个表.加入同步种
  15. Word,Excel,pdf,txt等文件上传并提取内容
  16. ucos系统初始化及启动过程
  17. UOJ #274. 【清华集训2016】温暖会指引我们前行 [lct]
  18. 使用Contacts Contract Content Provider操作通讯录最佳实践
  19. 学习Python--变量进阶
  20. java 基本原则

热门文章

  1. windows环境搭建
  2. 【C++】《C++ Primer 》第六章
  3. Python Kafka Client 性能测试
  4. Jenkins Android APP 持续集成体系建设二—自动部署、执行测试任务,关联打包任务
  5. python学习笔记 | 猜拳游戏
  6. 【Software Test】Basic Of ST
  7. Sqli - Labs 靶场笔记(一)
  8. floating point
  9. uni-app 开发随笔(踩坑记录)
  10. Spring Security OAuth2.0认证授权六:前后端分离下的登录授权