【KMP+最小循环节】F. Cyclic Nacklace
2024-09-30 19:09:23
https://www.bnuoj.com/v3/contest_show.php?cid=9147#problem/F
【题意】
给定一个字符串,问在字符串后最少添加多少个字母,得到的新字符串能是前缀循环的字符串。
【思路】
这道题的关键是要理解KMP中的nxt数组什么含义。
nxt[i]就是以i结尾的字符串中前缀和后缀匹配的最长长度。
所以len-nxt[len]就是最小循环节。
如abcdab,nxt[len]就是2,最小循环节就是4(abcd)。
理解了这个这道题就迎刃而解了。
【网上解释】
http://www.cnblogs.com/wuyiqi/archive/2012/01/06/2314078.html
【Accepted】
#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<string>
#include<cstring>
using namespace std;
int n;
const int maxn=1e5+;
const int inf=0x3f3f3f3f;
char str[maxn];
int nxt[maxn];
typedef long long ll;
void kmp_pre(int m)
{
int i,j;
j=nxt[]=-;
i=;
while(i<m)
{
while(i<m)
{
while(j!=-&&str[i]!=str[j])
{
j=nxt[j];
}
nxt[++i]=++j;
}
}
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
memset(nxt,,sizeof(nxt));
scanf("%s",str);
int len=strlen(str);
kmp_pre(len);
//cout<<nxt[len]<<endl;
int ans=len-nxt[len];
if(ans!=len&&len%ans==)
{
printf("0\n");
}
else
{
printf("%d\n",ans-(len-(len/ans)*ans));
}
}
return ;
}
最新文章
- percona server 二进制安装下编译tpcc-mysql的坑
- Bootstrap系列 -- 7. 列表排版方式
- 8天掌握EF的Code First开发系列之2 简单的CRUD操作
- jquery学习笔记1
- 10个优质PSD文件资源下载
- 关于memory 和 cache
- Ci 分页类的所有属性总结
- Win7 IE11无法打开的可能解决办法
- react 实用的性能优化方式
- Python 计算当真因子个数为偶数个时为幸运数,计算区间内幸运数之和
- 百度EasyDL文本分类自定义API示例代码 python
- Android--UI之Gallery
- maven 插件2
- JQuery效率问题
- Winsock版本的“hello world!”
- Atcoder681 Typical DP Contest E.数 数位dp
- Cesium随笔(3)随鼠标实时显示经纬度坐标以及高度【转】
- tensorflow中共享变量 tf.get_variable 和命名空间 tf.variable_scope
- sdc-docker
- python基础——操作系统简介
热门文章
- Ubuntu Server 上安装pip后pip命令报错的解决办法
- 动态规划:最大连续子序列乘积 分类: c/c++ 算法 2014-09-30 17:03 656人阅读 评论(0) 收藏
- Oracle代码 规则 创建表 表空间 用户等
- Atcoder B - Boxes 玄学 + 数学
- P1583 魔法照片
- 重构28-Rename boolean method(重命名布尔方法)
- iOS - 事件处理全过程(补充)
- SQL——视图、事务、锁、存储过程
- CSS中的趣事之float浮动
- Swift protocol extension method is called instead of method implemented in subclass