码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 子串循环问题 (Ver. I)


    目录

    题目描述

    思路分析

    AC代码


    题目描述

    给定一个字符串,求需要添加至少几个字符到字符串末尾才能使得整个字符串串由某一个不为本身的子串循环构成?
    如"abca",添加"bc"后构成"abcabc",其由子串"abc"循环构成;也可以添加"abca"后构成"abcaabca",其由子串"abca"循环构成,相比之下"bc"只有2个字符,添加的字符量最少。

    输入

    第一行包括一个整数T(1 <= T <= 100),代表测试组数

    每组测试数据包括一行字符串,其长度范围为 [3, 10^4]

    输出

    对于每组测试数据

    输出一个整数N,代表添加的最小字符数量

    输入样例1

    3
    aaa
    abca
    abcdefg

    输出样例1

    0
    2
    7

    思路分析

    利用到KMP的next值。

    我课上学的是下标从1开始的,next【0】存的是子串的长度,下一个next值需要根据前一个next值来确定,首先判断当前字符的前面所组成的字符串的前后缀(前一个字符和第一个字符)是否是相同的字符,如果相同,那么当前字符的next值为前一个next值+1,如果不同,继续比较前一个字符和前一个next值所对应的字符是否相同,如果都不相同,那么next值为1。

    这里需要用到一个定理:

    定理:假设S的长度为len,则S存在循环子串,当且仅当,len可以被len - next[len]整除,最短循环子串为S[len - next[len]]。

    这里的next值是从下标0开始的,我们可以让下标从1开始的next值减1来来表示。

    令L=len - next[len],那么满足题目的数值是L-next[len]%L。

    AC代码

    1. #include
    2. using namespace std;
    3. int FindNext(string son) {
    4. son+='#';
    5. int next[son.size() + 1];
    6. next[0] = son.size();
    7. next[1] = 0;
    8. int i = 2, j = 0;
    9. while (i <= next[0]) {
    10. if (j == 0 || son[i - 2] == son[j - 1]) {
    11. next[i] = j + 1;
    12. i++;
    13. j = next[i - 1];
    14. } else j = next[j];
    15. }
    16. size_t len=son.size()-1;
    17. size_t L=len-next[son.size()]+1;
    18. if(len%L==0&&len/L>1)
    19. return 0;
    20. return L-(next[son.size()]-1)%L;
    21. }
    22. int main() {
    23. int t;
    24. cin >> t;
    25. while (t--) {
    26. string test;
    27. cin >> test;
    28. cout<<FindNext(test)<
    29. }
    30. }
  • 相关阅读:
    快读快写 原理详解
    解决 CentOS 系统中的“-bash: wget: 未找到命令”问题
    uni-app微信小程序使用ECharts
    环形链表(C++解法)
    懒到骨子里了,我在CSDN写文章都懒得自己写了,基于selenium模拟写文章
    基于SSM实现高校应届生就业管理系统
    技术分享 | 某下一代防火墙远程命令执行漏洞分析及防护绕过
    Liunx两台服务器实现相互SSH免密登录
    大家都说Java有三种创建线程的方式!并发编程中的惊天骗局!
    模型实战(16)之StrongSort (OSNET)配合YOLOv5、v7、v8 实现多目标跟踪详解
  • 原文地址:https://blog.csdn.net/weixin_62264287/article/details/127377231
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号