HDU 3746 数据结构之KMP
2024-08-31 01:13:23
题意:给T组数据,每组一个字符串,问最少加入多少个字符能够使这个串变成一个子串连续出现的串
思路:利用KMP的next数组进行变换,next数组保存的是眼下为止与字符串从头開始的匹配的程度,也能够看成从头開始的位置。所以假设Next数组最后一个为0,则须要在加入一个这种串才干匹配成功。不然ans=len-Next[len]代表的是不能匹配的后面的串的长度。假设这个长度能够被len取余,则说明这个串已经匹配好了,不然就是这个长度减去取余后的数
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <algorithm>
using namespace std;
typedef long long ll;
const int inf=0x3f3f3f3f;
const int maxn=200010;
const int mod=10007;
char str1[maxn];
int Next[maxn];
void makenext(int m){
int i=0,j=-1;
Next[i]=-1;
while(i<m){
if(j==-1||str1[i]==str1[j])
Next[++i]=++j;
else j=Next[j];
}
}
//int KMP(int n,int m){
// int i=0,j=0,ans=0;
// while(i<n){
// if(j==-1||str2[i]==str1[j]) i++,j++;
// else j=Next[j];
// if(j==m){
// ans++;j=Next[j-1];i--;
// }
// }
// return ans;
//}
int main(){
int T,n;
scanf("%d",&T);
while(T--){
scanf("%s",str1);
int len=strlen(str1);
makenext(len);
if(Next[len]==0){
printf("%d\n",len);
continue;
}
int ans=len-Next[len];
if(len%ans==0) printf("0\n");
else printf("%d\n",ans-len%ans);
}
return 0;
}
最新文章
- 菜鸟学Struts2——零配置(Convention )
- 常用数据库的驱动程序和Url地址
- sorl入门
- js执行环境的深入理解
- 在MyEclipse显示struts2源码和doc文档及自动完成功能
- Windows Live Writer 初次使用
- 学DIV+CSS技术,如何入门?(2)
- ajax 例子
- 学会自己写jQuery插件(一)---基础
- Sql 执行删除修改之前添加备份
- laravel code bright
- codeblocks创建和使用静态库(C语言)
- CSS圆角样式
- erlang 初体验
- Webdriver+Java实现使用cookie跳过登录
- Nginx动静分离实现
- JavaEE三大框架整合
- 一次基于Vue.Js的用户体验优化 (vue drag)
- M0内核的STM32实现比较精准的延时
- 【Jmeter基础知识】Jmeter的三种参数化方式
热门文章
- Ext如何动态添加一行组件
- NSArray与NSMutableArray 数组与可变数组的创建和遍历 复习
- Changing the Output Voltage of a Switching Regulator on the Fly
- Jquery实现可拖拽的树菜单
- Java:终结器防卫者,顺便看一下 C# 如何做的。
- 负载均衡---在window与linux下配置nginx
- 单击行,自己主动选中当前行中的单选框button
- XML 简单介绍
- 在Qt示例项目的C ++ / QML源中的//! [0]的含义是什么?
- C#的四个基本技巧