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

给你一个字符串 s 求出所有满足s[i] == s[i+p] ( 0 < i+p < len )的 p ;

kmp中Next[i] 表示前i个字符的前缀和后缀的最大匹配 s[0--x] == s[i-x-1 --- i] ;

下面是看别人的解释:

•知识点:KMP算法、对next数组的理解
•KMP算法中next数组的含义是什么?
•next数组:失配指针
•如果目标串的当前字符i在匹配到模式串的第j个字符时失配,那么我们可以让i试着去匹配next(j)
•对于模式串str,next数组的意义就是:
•如果next(j)=t,那么str[1…t]=str[len-t+1…len]
•我们考虑next(len),令t=next(len);
•next(len)有什么含义?
•str[1…t]=str[len-t+1…len]
•那么,长度为len-next(len)的前缀显然是符合题意的。
•接下来我们应该去考虑谁?
•t=next( next(len) );
•t=next( next (next(len) ) );
• 一直下去直到t=0,每个符合题意的前缀长是len-t
 
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<stdlib.h>
using namespace std; const int N = 1e6+; char s[N];
int Next[N], ans[N]; void GetNext(char a[], int n)
{
int i=, j=-;
Next[] = -;
while(i<n)
{
if(j==- || a[i]==a[j])
Next[++i] = ++j;
else
j = Next[j];
}
} int main()
{
int T, t=, k, len;
scanf("%d", &T);
while(T--)
{
scanf("%s", s);
len = strlen(s);
GetNext(s, len);
k = ; for(int j=len; j>; j=Next[j])
ans[k++] = len - Next[j]; printf("Case #%d: %d\n", t++, k);
for(int i=; i<k; i++)
printf("%d%c", ans[i], i==k-?'\n':' ');
}
return ;
}

最新文章

  1. bzoj2702[SDOI2012]走迷宫
  2. 创建一个自定义颜色IRgbColor
  3. 前端学习 第四弹: HTML(一)
  4. 小吐槽Toolbar
  5. CentOS6.5下RPM方式安装mysql5.6.33
  6. IT公司100题-4-在二元树中找出和为某一值的所有路径
  7. CSS常用操作-图片
  8. ubuntu 下配置vim for python
  9. Performance Testing 前期准备以及场景设计
  10. 定时任务schedule(quartz)
  11. emWin表盘界面设计,含uCOS-III和FreeRTOS两个版本
  12. 微信小程序上传后发布或者体验版测试无数据解决办法
  13. Flannel配置详解
  14. C++的成员初始化列表和构造函数体(以前未知)
  15. h5的坑
  16. ES6 class的基本语法-学习笔记
  17. HTML中嵌套的子frame如何访问父页面中的函数?
  18. jexus配置支持Owin
  19. 【LOJ】#2111. 「JLOI2015」战争调度
  20. Swift coreAnimation 加计时器写的游戏《飞机大战》

热门文章

  1. java 代理模式,观察者模式
  2. FreeRTOS 消息队列
  3. Makefile学习之路5——通过函数增强功能
  4. 如果本身kali就在局域网,shell在外网,怎么反弹连接呢?
  5. a标签去掉下划线
  6. PHP——面向对象
  7. SpringBoot使用maven构建
  8. 数论 + 扩展欧几里得 - SGU 106. The equation
  9. JavaScript的gzip静态压缩方法记录
  10. selenium使用中遇到的问题