hdu 3746 Cyclic Nacklace(KMP求循环节)
2016-01-23 18:00
363 查看
题目大意:
给你一个字符串,要求将字符串的全部字符最少循环2次需要添加的字符数。
例子:
abcabc 已经循环2次,添加数为0。
abcac 没有循环2次,添加字符abcac。数目为5。
abcabcab 已经循环过2次,但第三次不完整,需要添加数为1。
循环节知识:/article/4990563.html
给你一个字符串,要求将字符串的全部字符最少循环2次需要添加的字符数。
例子:
abcabc 已经循环2次,添加数为0。
abcac 没有循环2次,添加字符abcac。数目为5。
abcabcab 已经循环过2次,但第三次不完整,需要添加数为1。
循环节知识:/article/4990563.html
#include<iostream> #include<stdio.h> #include<string.h> using namespace std; #define MAXN 100005//字符串长度 char str[MAXN]; int _next[MAXN]; void GetNext(char t[]) //求next数组 { int j,k,len; j=0;//从0开始,首先求_next[1] k=-1;//比较指针 _next[0]=-1;//初始值-1 len=strlen(t); while(j<len) { if(k==-1||t[j]==t[k]) //指针到头了,或者相等 { ++j; ++k; _next[j]=k;//此句可由优化替代 /*优化(求匹配位置时可用) if(t[j]!=t[k])_next[j]=k; else _next[j]=_next[k]; //*/ } else k=_next[k]; } } int main() { int T; int len; int len2;//最小循环节长度 scanf("%d",&T); while(T--) { scanf("%s",str); GetNext(str); len=strlen(str); len2=len-_next[len]; if(len2==len) { printf("%d\n",len2);//无循环 } else { if(len%len2==0) { printf("%d\n",0);//循环大于等于2次 } else { printf("%d\n",len2-(len%len2));//计算需要补充的字符数 } } } return 0; }
相关文章推荐
- 接口测试-postman+newman+jenkins组合
- csr8670--不能不知道的基本知识,长期记录
- .NET Core 1.0、ASP.NET Core 1.0和EF Core 1.0简介
- Objective-c开发教程--MRC和ARC混编
- IOS开发UI:Quartz2D的使用
- UIImageView添加手势不响应的原因
- 矩阵运算
- csr8670--sink工程的大致工作流程分析(以speaker为例)二
- HDU 3974 Assign the task
- 通过ValueAnimator实现点击展开和关闭的效果
- break,continue,return
- 没有猜中开头,更加没有预料结尾的我,正努力走在向程序媛发展的道路上……
- uva11462
- K-means算法原理与R语言实例
- JSON C# Class Generator ---由json字符串生成C#实体类的工具
- 简单理解python下的字符串
- Linux 盐计划:免费申请电脑试用 Linux,让你无忧折腾够
- 68. Pascal's Triangle II
- Mac下的VI bundle配置
- oKit6.0震撼发布,全面开启自定义模式