HDU 3746 Cyclic Nacklace (next数组的应用)
2016-03-28 16:39
393 查看
题目大意:
给你一个字符串,要求将字符串的全部字符最少循环2次需要添加的字符数。
例子:
abcabc 已经循环2次,添加数为0
abcac 没有循环2次,添加字符abcac。数目为5.
abcabcab 已经循环过2次,但第三次不完整,需要添加数为1
有这么个结论:len-next【len】等于循环节长度,嗯,很关键
解题思路:
next[]数组的运用。
给你一个字符串,要求将字符串的全部字符最少循环2次需要添加的字符数。
例子:
abcabc 已经循环2次,添加数为0
abcac 没有循环2次,添加字符abcac。数目为5.
abcabcab 已经循环过2次,但第三次不完整,需要添加数为1
有这么个结论:len-next【len】等于循环节长度,嗯,很关键
解题思路:
next[]数组的运用。
#include <cstdio> #include <iostream> #include <cstring> #include <string> #include <cstdlib> #include <algorithm> #include <cmath> #include <vector> #include <set> #include <list> #include <queue> #include <map> #include <stack> using namespace std; #define L(i) i<<1 #define R(i) i<<1|1 #define INF 0x3f3f3f3f #define pi acos(-1.0) #define eps 1e-3 #define maxn 1000010 #define MOD 100000000 int len; int Next[100010]; char s[100010]; void get_next() { int i = 0, j = -1; Next[0] = -1; while(i < len) { if(j == -1 || s[i] == s[j]) Next[++i] = ++j; else j = Next[j]; } } int main() { int T; scanf("%d",&T); while(T--) { scanf("%s",s); len = strlen(s); get_next(); // for(int i = 0; i <= len; i++) // printf("%d\n",Next[i]); int k = len - Next[len]; if(len != k && len % k == 0) //循环多次 printf("0\n"); else { int add = k - Next[len] % k; //取余的作用:abcab,去掉abc printf("%d\n",add); } } return 0; }
相关文章推荐
- cef 下载地址
- C#创建服务及使用程序自动安装服务,.NET创建一个即是可执行程序又是Windows服务的exe
- 数据查询优化
- BZOJ2462矩阵模板
- python中的集合
- Windows环境 安装Spring4.2.5源码
- Android异常处理最佳实践
- MongoDB基本命令
- 浙江科技学院第十三届程序设计竞赛 1008 A Heavy Rainy Day 贪心
- Linux crontab命令
- iOS 开发中有关pch文件,以及pch常用的内容
- RIP路由协议及工作原理
- 深入浅出nodejs学习笔记——异步编程
- 第三次实验作业
- java产生随机数
- IntelliJ IDEA快捷键
- 打印1到最大的n位数
- swift user guide.pdf下载
- C# fixed详解
- linux开机启动流程