这题琢磨了挺长的时间。需要理解next[]表示了什么; next[i]代表了前缀和后缀的最大匹配的值,也就是个数。

len-next[len]表示循环节的长度; 比如abcab   int fl=len-next[len]=3;循环节长度为3,即cab。然后int len=strlen(s)=5;

如果len%fl==0,那就count=len/fl,不然count=len/fl+1;count表示根据长度能够循环的次数。count*fl表示能够满足循环的时候的长度,

count*fl-len就是缺少的长度。不过如果next[len]==0,也就是本身的时候,就要输出自己的len了;

#include<stdio.h>
#include<string.h>
#define maxn 100010
char c[maxn];
int next[maxn];
void getnext()
{
int j,k,len=strlen(c);
j=;
k=-;
next[]=-;
while(j<len)
{
if(k==-||c[j]==c[k])
{
j++;
k++;
next[j]=k;
}
else
k=next[k];
}
}
void kmp()
{
int i,j;
getnext();
int len=strlen(c); /*for(i=0;i<=len;i++)
printf("%d ",next[i]);
printf("\n");*/
int fl=len-next[len];//循环节长度
int count=;
i=len;
count=len/fl;//循环节的次数
if(len%fl)//如果不能整除就要+1
count++;
// printf("%d %d ",fl,count);
if(next[len]==)//如果直接为0 所以就本身长度
printf("%d\n",len);
else
printf("%d\n",count*fl-len); }
int main()
{
int i,j,t;
scanf("%d",&t);
while(t--)
{
scanf("%s",c);
kmp();
}
}

最新文章

  1. sql server 修改表结构语法大全
  2. 30秒修复Ubuntu菱形乱码问题
  3. NServiceBus教程-持久化
  4. 【整理修订】Android.mk详解
  5. Delphi 缩放图像代码 - 支持PNG透明通道(利用了Windows的windowscodecs.dll)
  6. Eclipse Package Explorer视图无法打开
  7. 修真院java后端工程师学习课程--任务1(day one)
  8. scrapy_cookie禁用_延迟下载_自定义爬虫setting
  9. 数据库优化-mysql中INNODB和MYIASM引擎的区别
  10. Docker: docker image常用命令实战
  11. printf是在libc库中么?
  12. A1016. Phone Bills
  13. 51nod-1298 圆与三角形(计算几何超详解)
  14. 第二阶段每日站立会议Second Day
  15. JavaScript之深浅拷贝
  16. oracle 批量删除触发器
  17. Windows10 安装 .Net 3.5 失败的解决方案
  18. 电脑破解wifi密码(至少连过1次的才可以)
  19. c# 判断两个集合是否有交集
  20. Mathematica多元隐函数作图

热门文章

  1. MIT jos 6.828 Fall 2014 训练记录(lab 3)
  2. UESTC 900 方老师炸弹 --Tarjan求割点及删点后连通分量数
  3. sql 入门经典(第五版) Ryan Stephens 学习笔记 (第六,七,八,九,十章,十一章,十二章)
  4. MySQL数据库学习笔记(一)----MySQL 5.6.21的安装和配置(setup版)
  5. Socurce Insight 快捷键
  6. 用CSS3实现上下左右箭头
  7. ArcGis 统计方法
  8. [转]hadoop hdfs常用命令
  9. C语言 文件操作2--文件缓存的理解
  10. 使用ObjectAnimator设置动画