hdu3746 KMP的next数组应用,求项链首尾项链循环
2023-09-11 14:14:00 时间
题意:
给你一个项链,问你最少加多少个珠子能满足整个项链是一个循环的项链(首尾相连)
思路:
KMP的简单应用只要了解next数组的意义就好说了,下面总结下
next在循环方面的常用应用
(1)i - next[i] 最小循环节(第一个字母开始)
(2)next[i] 最大循环节中的第几位数(此时循环节可交叉)
(3)next[i] != 0 && i % (i - next[i]) == 0,当前是循环节中的最 后一位.
(4)在(3)的前提下 i / (i - next[i]) 表示的最大周期个数,也就是在最小循环节的前提下的最大周期个数。那么这个题目就好办了,先求出,如果next[n] && n % (n - next[n])
给你一个项链,问你最少加多少个珠子能满足整个项链是一个循环的项链(首尾相连)
思路:
KMP的简单应用只要了解next数组的意义就好说了,下面总结下
next在循环方面的常用应用
(1)i - next[i] 最小循环节(第一个字母开始)
(2)next[i] 最大循环节中的第几位数(此时循环节可交叉)
(3)next[i] != 0 && i % (i - next[i]) == 0,当前是循环节中的最 后一位.
(4)在(3)的前提下 i / (i - next[i]) 表示的最大周期个数,也就是在最小循环节的前提下的最大周期个数。那么这个题目就好办了,先求出,如果next[n] && n % (n - next[n])
直接输出0,因为此时最后一个是循环节上的数字,并且是最后一个。否则就输出(n - next[n]) - n % (n - next[n])
#include<stdio.h> #include<string.h> #define N 100000 + 100 int next[N]; char str[N]; void get_next(int m) { int j ,k; j = 0 ,k = -1; next[0] = -1; while(j < m) { if(k == -1 || str[j] == str[k]) next[++j] = ++k; else k = next[k]; } return ; } int main () { int t ,i ,m; scanf("%d" ,&t); while(t--) { scanf("%s" ,str); m = strlen(str); get_next(m); if(next[m] && m % (m - next[m]) == 0) puts("0"); else printf("%d\n" ,(m - next[m]) - m % (m - next[m])); } return 0; }
相关文章
- 一段linux shell 代码涉及for循环和if esle
- 【Shell基础】循环:for、while、until
- Spring Bean 循环依赖为什么需要三级缓存
- Atitit 循环(loop), 递归(recursion), 遍历(traversal), 迭代(iterate).
- js中forEach,for in,for of循环的用法和区别(一个比较神奇的例子)
- DL之RNN:循环神经网络RNN的简介、应用、经典案例之详细攻略
- C语言 第六章 多重循环
- 底部检测的do...while循环
- python基础语法(第一章)(变量,注释,判断,循环,输入,输出)
- Python基础之循环语句
- python基础入门之for和while循环实战