目录

  • @description@
  • @solution@
  • @code@
  • @details@


@description@

给你一个长度为 n 的由小写字母组成的字符串,让你在末尾增加尽量少的字母,使它变为循环串。

input
多组数据。第一行数据组数 T,T <= 100。
接下来 T 行,每行一个长度为 n 的字符串,n <= 100000。

output
对于每组数据,输出最少的字母数。

sample input
3
aaa
abca
abcde
sample output
0
2
5

@solution@

【我只是来复习 KMP 的……】

如果长度为 n 的串 \(S\) 是一个循环节为 \(k\) 的循环串的前缀,那么我们可以将它补成循环节为 \(k\) 的循环串。
如果 \(S\) 是循环节为 \(k_1\) 与循环节为 \(k_2\) 两个串的前缀,则 \(S\) 一定是循环节为 \(gcd(k_1, k_2)\) 串的前缀。
假如 \(k_1\) 是 \(k_2\) 的倍数,则将 \(S\) 补成循环节为 \(k_2\) 的代价一定小于等于改成循环节为 \(k_1\) 的。
综合以上性质,我们相当于是要求解以 \(S\) 为前缀的循环串的最小循环节。

然后可以证明,"\(S\) 是一个循环节为 \(k\) 的循环串的前缀" 与 "\(S\) 长度为 \(n-k\) 的后缀等于 \(S\) 长度为 \(n-k\) 的前缀" 等价,即它们互为充要条件。
所以我们就可以用 KMP 搞了。

注意两种特殊情况:(1)\(S\) 本身是循环串(2)以 \(S\) 为前缀的循环串的最小循环节为 \(S\) 的长度。

@code@

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int MAXN = 100000;
void GetFail(char *T, int *f) {int lenT = strlen(T);f[0] = -1, f[1] = 0;for(int i=2;i<=lenT;i++) {int j = f[i-1];while( j != -1 && T[j] != T[i-1] )j = f[j];f[i] = j + 1;}
}
char S[MAXN + 5];
int fail[MAXN + 5];
void solve() {scanf("%s", S); GetFail(S, fail);int lenS = strlen(S);if( fail[lenS] == 0 ) printf("%d\n", lenS);else if( lenS % (lenS - fail[lenS]) == 0 ) printf("%d\n", 0);else printf("%d\n", (lenS - fail[lenS]) - lenS%(lenS - fail[lenS]));
}
int main() {int T; scanf("%d", &T);for(int i=1;i<=T;i++) solve();
}

@details@

一开始写得极其复杂……还讨论了它最后循环串的循环节等各种稀奇古怪的东西……
几个月不碰这个玩意儿基本快忘完了吧……

转载于:https://www.cnblogs.com/Tiw-Air-OAO/p/10202036.html

@hdu - 3746@ Cyclic Nacklace相关推荐

  1. hdu 3746 Cyclic Nacklace

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3746 思路:KMP中Next数组的应用,求出最小的循环节,题目的意思是只能在字符串的后面上添加新的字符 ...

  2. 字符串周期--hdu 3746 Cyclic Nacklace

    通过这题得出了一个很重要的结论,在用kmp算法求出next数组后,len-next[len]的值就是该字符串的最小循环节,该字符串的其他循环节都是它的倍数,如果len恰好是len-next[len]的 ...

  3. HDU - 3746 Cyclic Nacklace(KMP的next数组判循环节)

    题目链接:点击查看 题目大意:现在规定想要制作一串珍珠手链,需要用到两段一模一样的字符串首位相接而成,现在给定一个字符串,问最少需要添加几个珍珠才能满足条件 题目分析:一开始以为是个简单的模拟题,但后 ...

  4. 【HDU - 3746 】Cyclic Nacklace (KMP,最小循环节问题)

    题干: CC always becomes very depressed at the end of this month, he has checked his credit card yester ...

  5. HDU - Cyclic Nacklace(KMP)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3746 Time Limit: 2000/1000 MS (Java/Others) Memory Li ...

  6. HDU 1853 Cyclic Tour

    HDU_1853 首先,如果要保证图有环,并且环之间没有交点的话,那么必然每个点的出度和入度都应为1,因此我们可以把一个点拆成两个点,分别表示出度及入度,然后去找拆点后构成的二分图的完美匹配. 对于怎 ...

  7. hdu 3746 kmp求循环节 下标从1开始

    长度为m[1,2...m]的模式的循环节为 m-next[m] , aaa  循环节clc为1  (clc=m-next[m]= 3-2  =1)       此时   m%clc == 0   表示 ...

  8. kuangbin带你飞专题合集

    题目列表 [kuangbin带你飞]专题一 简单搜索 [kuangbin带你飞]专题二 搜索进阶 [kuangbin带你飞]专题三 Dancing Links [kuangbin带你飞]专题四 最短路 ...

  9. 算法学习经典例题整理

    陆续会对本篇博客进行更新! 搜索:https://vjudge.net/contest/292597 区间DP:https://vjudge.net/contest/293892 树状背包:https ...

最新文章

  1. 杂谈人工智能说大数据
  2. FZU 2214 Knapsack problem(背包问题)
  3. 《学习之道》第七章总结
  4. apk图标存放位置_安卓系统下安装完apk程序后,具体的文件夹位置在哪里呢?
  5. DIV Scroll属性
  6. java之点击一次之后失效_JavaScript 事件绑定只能执行一次了,再次点击就变得无效 ,求助怎么回事...
  7. 【luogu P2341 [HAOI2006]受欢迎的牛】 题解
  8. Web播放器学习笔记(二) 1 Bit Audio Player
  9. 【综述】跨语言自然语言处理笔记
  10. # C# 如何调用动态连接库?
  11. unityar自动识别人脸_AR开发实战项目之人脸识别(实现换脸、人脸涂妆、动作特效)...
  12. M1芯片CAD如何安装?M1 mac怎么安装AutoCAD?
  13. 计算机显示文档在哪打开,我的文档在哪?小编教你找到电脑Windows系统我的文档在哪...
  14. qlv转mp4工具下载
  15. python逻辑回归模型建模步骤_Python逻辑回归——建模-评估模型
  16. DM8数据库入门学习总结
  17. Android基础 《密西西比河谷州立大学:Android应用程序开发》(一)
  18. ZUCC_BB平台-Quiz B-3-5-答案
  19. 计算机会计二级科目,(完整版)会计科目一览表(一级科目二级科目三级科目)..pdf...
  20. linux怎么在终端里查系统信息,Neofetch:在终端中显示Linux系统信息

热门文章

  1. DButils的更新与查询,利用C3P0链接数据库
  2. Linux之bash shell基本命令
  3. 缓冲流、转换流、序列化流代码练习
  4. 中国石油大学计算机专业论文,中国石油大学(计算科学与技术专业)毕业论文规范.doc...
  5. 计算机access2级选择题真题,计算机二级《ACCESS》选择题练习及答案
  6. 历经 7 年双 11 实战,阿里巴巴是如何定义云原生混部调度优先级及服务质量的?
  7. 进击的 Kubernetes 调度系统(二):支持批任务的 Coscheduling/Gang scheduling
  8. 初探云原生应用管理(二): 为什么你必须尽快转向 Helm v3
  9. workerman在linux上怎么运行,linux系统中workerman的安装步骤
  10. 计算机网络的拓扑结构主要有新型,计算机网络中主要拓扑结构有 ______。