hdu3746 KMP
2024-10-14 19:54:58
这题琢磨了挺长的时间。需要理解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();
}
}
最新文章
- sql server 修改表结构语法大全
- 30秒修复Ubuntu菱形乱码问题
- NServiceBus教程-持久化
- 【整理修订】Android.mk详解
- Delphi 缩放图像代码 - 支持PNG透明通道(利用了Windows的windowscodecs.dll)
- Eclipse Package Explorer视图无法打开
- 修真院java后端工程师学习课程--任务1(day one)
- scrapy_cookie禁用_延迟下载_自定义爬虫setting
- 数据库优化-mysql中INNODB和MYIASM引擎的区别
- Docker: docker image常用命令实战
- printf是在libc库中么?
- A1016. Phone Bills
- 51nod-1298 圆与三角形(计算几何超详解)
- 第二阶段每日站立会议Second Day
- JavaScript之深浅拷贝
- oracle 批量删除触发器
- Windows10 安装 .Net 3.5 失败的解决方案
- 电脑破解wifi密码(至少连过1次的才可以)
- c# 判断两个集合是否有交集
- Mathematica多元隐函数作图
热门文章
- MIT jos 6.828 Fall 2014 训练记录(lab 3)
- UESTC 900 方老师炸弹 --Tarjan求割点及删点后连通分量数
- sql 入门经典(第五版) Ryan Stephens 学习笔记 (第六,七,八,九,十章,十一章,十二章)
- MySQL数据库学习笔记(一)----MySQL 5.6.21的安装和配置(setup版)
- Socurce Insight 快捷键
- 用CSS3实现上下左右箭头
- ArcGis 统计方法
- [转]hadoop hdfs常用命令
- C语言 文件操作2--文件缓存的理解
- 使用ObjectAnimator设置动画