HDU_3746 Cyclic Nacklace(KMP)
题目请点我
题解:
题目大意:有一个字符串s。能够在前后加入字符,使字符串成为一个循环次数至少为2的循环字符串。输出最少须要加入的字符数目。
首先能够证明题目能够等价为仅仅在末尾加入字符使满足题意。要找到加入资格字符我们首先要找到循环单位的长度。利用一个辅助数组储存从起始位置開始长度为i的串的循环长度,初始值为i,利用与Next数组之间的关系来更新。找到循环长度。比方字符串abcabc,Next[i] = 3,cycle[3] = 3,有等价关系i-Next[i] = cycle[Next[i]];所以循环长度为3.可是注意假设某个字符不能与上一个字符串相应。则须要更新循环长度为当前字符串长度。
例子:
abcdabcda
3
ababac
6
aaaaab
6
代码实现:
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#define MAX 100010
using namespace std;
int T;
int res;
int len;
char s[MAX];
int Next[MAX];
int cycle[MAX];
void getnext();
int main(){
scanf("%d",&T);
getchar();
while( T-- ){
gets(s);
len = strlen(s);
getnext();
res = len;
for( int i = 1; i <= len; i++ ){
cycle[i] = i;
int tmp = Next[i];
if( cycle[tmp] == i-tmp ){
cycle[i] = cycle[tmp];
res = cycle[i];
}
else if( res != len && s[i-1] != s[i-res-1] ){
res = cycle[i];
}
}
if( len == res ){
res = len-Next[len]*2;
}
else if( len%res == 0 ){
res = 0;
}
else{
res = res-(len%res);
}
printf("%d\n",res);
}
return 0;
}
void getnext(){
memset(Next,0,sizeof(Next));
Next[0] = -1;
int i = 0, j = -1;
while( i < len ){
if( j == -1 || s[i] == s[j] ){
Next[++i] = ++j;
}
else{
j = Next[j];
}
}
return ;
}
另外看到同学的一种递归写法。感觉更巧妙一点,理解起来不太easy。
核心代码:
int solve(int pos){
int tmp = Next[pos]*2;
//无重叠
if( tmp <= pos ){
return pos-tmp;
}
//有重叠
else{
return solve(Next[pos]);
}
}
理解:
对于一个字符串来说,他的前缀串与后缀串分为有重叠和无重叠两种情况。
比方abcabcabc是有重叠;abcab是无重叠,详细关系体如今2*Next与pos大小比較。无重叠我们能够直接输出前缀串与后缀串不同样的部分;对于有重叠我们要递归的向前去找,找到缺少的部分的长度。比方我们用AXBYC表示一个重叠串,当中每一个大写字母表示一个子串,而B为重叠部分,能够证明的是A=B=C,X=Y,作为循环单位缺少的一部分我们要向前递归,知道子串的前缀串与后缀串不再重叠,从而找到X的长度,而特殊情况aaaaaaaaaa。依照上面的定义则他的ABC都是重叠的。所以递归找子问题,直到不再重叠。
HDU_3746 Cyclic Nacklace(KMP)的更多相关文章
- HDU 3746 Cyclic Nacklace(kmp next数组运用)
Cyclic Nacklace Problem Description CC always becomes very depressed at the end of this month, he ha ...
- hdu 3746 Cyclic Nacklace KMP循环节
Cyclic Nacklace 题意:给一个长度为Len( 3 <= Len <= 100000 )的英文串,问你在字符串后面最少添加几个字符可以使得添加后的串为周期串? Sample I ...
- HDU3746 Cyclic Nacklace —— KMP 最小循环节
题目链接:https://vjudge.net/problem/HDU-3746 Cyclic Nacklace Time Limit: 2000/1000 MS (Java/Others) M ...
- HDU_3746 Cyclic Nacklace 【KMP的应用】
一.题目 HDU3746 二.分析 KMP比较好解决的一个问题:如果求一个串中的循环节? 仔细回想KMP的用法,重点是next数组,相当于就是后缀和前缀的比较,那么不正是方便了我们确定循环节? 如果以 ...
- hdu3746 Cyclic Nacklace KMP
CC always becomes very depressed at the end of this month, he has checked his credit card yesterday, ...
- Match:Cyclic Nacklace(KMP的next数组的高级应用)(HDU 3746)
串珠子 题目大意:给定一个字串,要你找到如果要使之成为循环串,在末尾需要的最小的字数(只能添加字符,不能删减字符) 首先联动一下之前做过的动态规划问题POJ 3280,当然了3280这一题是用的LD, ...
- HDU 3746 Cyclic Nacklace KMP
题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=3746 KMP算法—— AC代码: #include <iostream> #include ...
- hdu 3746 Cyclic Nacklace(kmp最小循环节)
Problem Description CC always becomes very depressed at the end of this month, he has checked his cr ...
- HDU 3746 Cyclic Nacklace (KMP求循环节问题)
<题目链接> 题目大意: 给你一个字符串,要求将字符串的全部字符最少循环2次需要添加的字符数. [>>>kmp next函数 kmp的周期问题] #include &l ...
随机推荐
- Linux useradd -M -s
groupadd mysql #创建mysql分组 useradd -M(不创建主目录) -s(不允许登录) /sbin/nologin mysql -g(加入mysql组) mysql
- HDU1711 Number Sequence KMP
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - HDU1711 题意概括 给T组数据,每组有长度为n和m的母串和模式串.判断模式串是否是母串的子串,如果是输出 ...
- Github+阿超运算
感谢自己寒假能够稍稍做一点努力. Github个人页面<构建之法阅读笔记二可见>: https://github.com/Heartxy8990 申请教程: http://jingyan. ...
- 【Java】 剑指offer(54) 二叉搜索树的第k个结点
本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集 题目 给定一棵二叉搜索树,请找出其中的第k小的结点. 思路 设置全局变量 ...
- 洛谷 p1123 取数游戏【dfs】
题目链接:https://www.luogu.org/problemnew/show/P1123 转载于:>>>>>> 题目描述 一个N×M的由非负整数构成的数字矩 ...
- 无状态shiro认证组件(禁用默认session)
准备内容 简单的shiro无状态认证 无状态认证拦截器 import com.hjzgg.stateless.shiroSimpleWeb.Constants; import com.hjzgg.st ...
- codeforces1027F. Session in BSU
题目链接 codeforces1027F. Session in BSU 题解 二分图匹配就fst了....显然是过去的,不过tle test87估计也pp了,好坑 那么对于上面做匹配的这个二分图分情 ...
- Java内存区域与内存溢出异常--HotSpot虚拟机对象探秘
以常用的HotSpot和常用的Java堆为例,深入探讨HotSpot虚拟机在Java堆中对象分配.布局和访问的全过程 1.对象的创建 ①虚拟机遇到一条new指令后,首先将去检查这个指令的参数是否能够在 ...
- iOS web view 与 js 交互
移动应用中许多复杂的且经常改动的页面会使用H5进行代替native,这里就会使用到js和webview的交互 iOS里面,UIWebView提供了方法stringByEvaluatingJavaScr ...
- awk 入门教程
作者: 阮一峰 日期: 2018年11月 7日 awk是处理文本文件的一个应用程序,几乎所有 Linux 系统都自带这个程序. 它依次处理文件的每一行,并读取里面的每一个字段.对于日志.CSV 那 ...