# 10035. 「一本通 2.1 练习 1」Power Strings

【题目描述】

给定若干个长度 $\le 10^6$​​ 的字符串,询问每个字符串最多是由多少个相同的子字符串重复连接而成的。如:ababab 则最多有 333 个 ab 连接而成。

【算法】

1、kmp第一步求出字符串的特征向量。若n%(n-nxt[n])==0&&nxt[n](n是字符串长度)则循环节个数为n/(n-nxt[n]),更一般地对每一个位置 $i$ 若n%(n-nxt[n])==0&&nxt[n],则前i个字符循环。

2、也可以用字符串hash,枚举循环节长度 $l$ + $O(1)$ 判定。

【代码】

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. int nxt[1000100];
  4. char s[1000100];
  5. int main() {
  6. while(~scanf("%s",s+1)&&s[1]!='.') {
  7. int n=strlen(s+1);
  8. nxt[1]=0;
  9. for(int i=2,j=0;i<=n;i++) {
  10. while(j>0&&(j==n||s[i]!=s[j+1])) j=nxt[j];
  11. if(s[i]==s[j+1]) j++;
  12. nxt[i]=j;
  13. }
  14. if(n%(n-nxt[n])==0&&nxt[n]) printf("%d\n",n/(n-nxt[n]));
  15. else puts("1");
  16. }
  17. return 0;
  18. }

# 10045. 「一本通 2.2 练习 1」Radio Transmission

【题目描述】

给你一个字符串,它是由某个字符串不断自我连接形成的。但是这个字符串是不确定的,现在只想知道它的最短长度是多少。

【算法】

由于该字符串可能不完全,考虑若非循环串我们将其补全,由于是最小循环节,显然,当前串最后一个字符必然位于最后一个循环节内。同时最后一个字符在匹配串和主串中和补全的最后一个字符相对位置不变,于是 $n-nxt[n]$ 也即最小循环节长度。

【代码】

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. int n;
  4. int nxt[1000100];
  5. char s[1000100];
  6. int main() {
  7. scanf("%d%s",&n,s+1);
  8. nxt[1]=0;
  9. for(int i=2,j=0;i<=n;i++) {
  10. while(j>0&&(j==n||s[i]!=s[j+1])) j=nxt[j];
  11. if(s[i]==s[j+1]) j++;
  12. nxt[i]=j;
  13. }
  14. int val;
  15. for(int k=nxt[n];k;k=nxt[k])
  16. if(k) val=n-k;
  17. if(n%val) printf("%d\n",n/val+1);
  18. else printf("%d\n",n/val);
  19. return 0;
  20. }

# 10046. 「一本通 2.2 练习 2」OKR-Periods of Words

【题目描述】

串是有限个小写字符的序列,特别的,一个空序列也可以是一个串。一个串 P 是串 A 的前缀,当且仅当存在串 B,使得 A = PB。如果 P≠A 并且 P 不是一个空串,那么我们说 P 是 A 的一个 proper 前缀。

定义 Q 是 A 的周期,当且仅当 Q 是 A 的一个 proper 前缀并且 A 是 QQ 的前缀(不一定要是 proper 前缀)。比如串 ababababab 都是串 abababa 的周期。串 A 的最大周期就是它最长的一个周期或者是一个空串(当 A 没有周期的时候),比如说,ababab 的最大周期是 abab。串 abc 的最大周期是空串。

给出一个串,求出它所有前缀的最大周期长度之和。

【算法】

这道题要求最大周期也就是循环节长度的最大值(原长不算,因为原长非周期)。于是我们考虑因为 $nxt[i]$ 数组记录的是离 i 最近的所能匹配的模式串位置,于是只要找到离 i 最远的能匹配的模式串位置即可。要么先计算出 $nxt[i]=j$ 的值,然后沿nxt数组一直找下去,直到为0的前一个,但是这样会T。于是我们再开一个数组f,记录离 i 最远的所能匹配的模式串位置,可以递推若 $f[j]>0则f[i]=j否则f[i]=j$。

【代码】

  1. #include <bits/stdc++.h>
  2. #define ll long long
  3. using namespace std;
  4. int n;
  5. ll ans;
  6. int nxt[1000100],f[1000100];
  7. char s[1000100];
  8. int main() {
  9. scanf("%d%s",&n,s+1);
  10. nxt[1]=0;
  11. for(int i=2,j=0;i<=n;i++) {
  12. while(j>0&&(j==n||s[i]!=s[j+1])) j=nxt[j];
  13. if(s[i]==s[j+1]) j++;
  14. nxt[i]=j;
  15. if(f[j]>0) f[i]=f[j];
  16. else f[i]=j;
  17. if(f[i]) {
  18. int len=i-f[i];
  19. if(i%len==0) ans+=(i/len-1)*len;
  20. else ans+=i/len*len;
  21. }
  22. }
  23. printf("%lld\n",ans);
  24. return 0;
  25. }

KMP解决最小循环节问题的更多相关文章

  1. [KMP求最小循环节][HDU1358][Period]

    题意 求所有循环次数大于1的前缀 的最大循环次数和前缀位置 解法 直接用KMP求最小循环节 当满足i%(i-next[i])&&next[i]!=0 前缀循环次数大于1 最小循环节是i ...

  2. [KMP求最小循环节][HDU3746][Cyclic Nacklace]

    题意 给你个字符串,问在字符串末尾还要添加几个字符,使得字符串循环2次以上. 解法 无论这个串是不是循环串 i-next[i] 都能求出它的最小循环节 代码: /* 思路:kmp+字符串的最小循环节问 ...

  3. KMP + 求最小循环节 --- POJ 2406 Power Strings

    Power Strings Problem's Link: http://poj.org/problem?id=2406 Mean: 给你一个字符串,让你求这个字符串最多能够被表示成最小循环节重复多少 ...

  4. HDU 3746 (KMP求最小循环节) Cyclic Nacklace

    题意: 给出一个字符串,要求在后面添加最少的字符是的新串是循环的,且至少有两个循环节.输出最少需要添加字符的个数. 分析: 假设所给字符串为p[0...l-1],其长度为l 有这样一个结论: 这个串的 ...

  5. KMP + 求最小循环节 --- HUST 1010 - The Minimum Length

    The Minimum Length Problem's Link: http://acm.hust.edu.cn/problem/show/1010 Mean: 给你一个字符串,求这个字符串的最小循 ...

  6. 模板题 + KMP + 求最小循环节 --- HDU 3746 Cyclic Nacklace

    Cyclic Nacklace Problem's Link: http://acm.hdu.edu.cn/showproblem.php?pid=3746 Mean: 给你一个字符串,让你在后面加尽 ...

  7. KMP + 求最小循环节 --- HDU 1358 Period

    Period Problem's Link: http://acm.hdu.edu.cn/showproblem.php?pid=1358 Mean: 给你一个字符串,让你从第二个字符开始判断当前长度 ...

  8. KMP解决字符串最小循环节相关问题

    经典问题 : 给出一个由某个循环节构成的字符串,要你找出最小的循环节,例如 abababab 最小循环节当是 ab ,而类似 abab 也可以成为它的循环节,但并非最短. 分析 : 对于上述问题有两个 ...

  9. POJ2406Power Strings (最小循环节)(KMP||后缀数组)

    Given two strings a and b we define a*b to be their concatenation. For example, if a = "abc&quo ...

随机推荐

  1. linux system函数引发的错误

    转: https://my.oschina.net/renhc/blog/54582 先看一下问题 简单封装了一下system()函数:   int pox_system(const char *cm ...

  2. UVa 1600 Patrol Robot (BFS最短路 && 略不一样的vis标记)

    题意 : 机器人要从一个m * n 网格的左上角(1,1) 走到右下角(m, n).网格中的一些格子是空地(用0表示),其他格子是障碍(用1表示).机器人每次可以往4个方向走一格,但不能连续地穿越k( ...

  3. 185.[USACO Oct08] 挖水井 (第三次考试大整理)

    185. [USACO Oct08] 挖水井 输入文件:water.in   输出文件:water.out   简单对比 时间限制:1 s   内存限制:128 MB 农夫约翰决定给他的N(1< ...

  4. macOS 更新 git 命令提示 xcrun,.gitignore 配置不生效问题。

    macOS 更新 运行git提示xcrun: error: invalid active developer path 在终端输入 xcode-select --install 即可以解决该问题 .g ...

  5. CSS 手动画热销小图标

    效果图 HTML 标签 <div class="main"> <div class="small"> <div class=&qu ...

  6. Android处理未捕获的异常(应用全局异常)

    public class CrashHandler implements UncaughtExceptionHandler { private static CrashHandler instance ...

  7. JDK源码--HashMap(之resize)

    1.HashMap源码阅读目标了解具体的数据结构(hash及冲突链表.红黑树)和重要方法的具体实现(hashCode.equals.put.resize...) 2.重要方法 hashCode 与 e ...

  8. 后盾网lavarel视频项目---页面post方式提交之后动态弹出错误信息

    后盾网lavarel视频项目---页面post方式提交之后动态弹出错误信息 一.总结 一句话总结: 1.思路和我想的一样,有错误的时候弹出提示错误消息的模态框就好,没有错误的时候不管它 2.把模态框的 ...

  9. Oracle JET mobile cordove navigator.app对象

    在使用 Oracle JET 开发 webapp 时,会使用到 ojrouter ,ojrouter 默认含有历史记录推送功能.在调试 Android 时会发现返回键总是返回到上一次浏览记录(App ...

  10. Flask基础以及Response三剑客

    Flask的特点: 优点:小而精.三方组件全    缺点: 性能相对较差   因为依赖三方组件所以在更新的时候难免不同步 基础模板 from flask import Flask app = Flas ...