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 ...
随机推荐
- BZOJ1607 [Usaco2008 Dec]Patting Heads 轻拍牛头 筛法
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1607 题意概括 给出n个数,每一个数字<1000000,对于每一个数,让你求剩余的n-1个数 ...
- ATM+购物车商城
模拟实现一个ATM + 购物商城程序 额度 15000或自定义 实现购物商城,买东西加入 购物车,调用信用卡接口结账 可以提现,手续费5% 支持多账户登录 支持账户间转账 记录每月日常消费流水 提供还 ...
- String 方法indexOf()
indexOf()来测是否包含子字符串. indexOf(sub, start) 如果return 是-1 包含没有找到字段.
- 使用windows脚本移动文件
1. 移动脚本 在部署web项目时,一般需要将打包的war包发布到Tomcat目录下,所以自己就在网上查找资料写了一个简略的移动文件的脚本,如下: @echo off echo "使用bat ...
- 自己开发能在asp.net项目正常使用的定时器WebTimer,让定时器听话起来
简述: iis是一个很不错的服务器,有很多很好用的特性来支持网站运行,但有时候这些特性却会影响到我们开发者的一些操作.比如我们需要定时运行做一些操作,但由于iis的利用应用程序池来管理这种方式会让网站 ...
- node+express+mongodb初体验
从去年11月份到现在,一直想去学习nodejs,在这段时间体验了gulp.grunt.yeomen,fis,但是对于nodejs深入的去学习,去开发项目总是断断续续. 今天花了一天的时间,去了解整理整 ...
- BZOJ.1009.[HNOI2008]GT考试(KMP DP 矩阵快速幂)
题目链接 设f[i][j]为当前是第i位考号.现在匹配到第j位(已有j-1位和A[]匹配)的方案数 因为假如当前匹配j位,如果选择的下一位与A[j+1]不同,那么新的匹配位数是fail[j]而不是0, ...
- 洛谷.2596.[ZJOI2006]书架(Splay)
题目链接 /* 五个操作: 1.将某元素置顶.删掉这个数,插入最左 2.将某元素置底.同样 3.旋到根后,直接将这个数与前驱/后继交换所有信息 不是左右子节点! 4.5.裸平衡树 ps:1.用pos[ ...
- APM的3DR无线数传的安装和调试
APM飞控修改数传模块方法 http://www.cnblogs.com/wsine/p/4909903.html APM的3DR无线数传的安装和调试 http://tieba.baidu.com/p ...
- tomcat能正常启动但是访问项目的welcome界面出现404
http://www.linuxidc.com/Linux/2017-03/141986.htm http://blog.csdn.net/shasiqq/article/details/513026 ...