题目请点我

题解:

题目大意:有一个字符串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)的更多相关文章

  1. HDU 3746 Cyclic Nacklace(kmp next数组运用)

    Cyclic Nacklace Problem Description CC always becomes very depressed at the end of this month, he ha ...

  2. hdu 3746 Cyclic Nacklace KMP循环节

    Cyclic Nacklace 题意:给一个长度为Len( 3 <= Len <= 100000 )的英文串,问你在字符串后面最少添加几个字符可以使得添加后的串为周期串? Sample I ...

  3. HDU3746 Cyclic Nacklace —— KMP 最小循环节

    题目链接:https://vjudge.net/problem/HDU-3746 Cyclic Nacklace Time Limit: 2000/1000 MS (Java/Others)    M ...

  4. HDU_3746 Cyclic Nacklace 【KMP的应用】

    一.题目 HDU3746 二.分析 KMP比较好解决的一个问题:如果求一个串中的循环节? 仔细回想KMP的用法,重点是next数组,相当于就是后缀和前缀的比较,那么不正是方便了我们确定循环节? 如果以 ...

  5. hdu3746 Cyclic Nacklace KMP

    CC always becomes very depressed at the end of this month, he has checked his credit card yesterday, ...

  6. Match:Cyclic Nacklace(KMP的next数组的高级应用)(HDU 3746)

    串珠子 题目大意:给定一个字串,要你找到如果要使之成为循环串,在末尾需要的最小的字数(只能添加字符,不能删减字符) 首先联动一下之前做过的动态规划问题POJ 3280,当然了3280这一题是用的LD, ...

  7. HDU 3746 Cyclic Nacklace KMP

    题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=3746 KMP算法—— AC代码: #include <iostream> #include ...

  8. hdu 3746 Cyclic Nacklace(kmp最小循环节)

    Problem Description CC always becomes very depressed at the end of this month, he has checked his cr ...

  9. HDU 3746 Cyclic Nacklace (KMP求循环节问题)

    <题目链接> 题目大意: 给你一个字符串,要求将字符串的全部字符最少循环2次需要添加的字符数. [>>>kmp next函数 kmp的周期问题]  #include &l ...

随机推荐

  1. 【Java】 剑指offer(9) 斐波那契数列及青蛙跳台阶问题

     本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集   题目 写一个函数,输入n,求斐波那契(Fibonacci)数列的第n项 ...

  2. hdu 5407【LCM性质】+【逆元】(结论题)

    <题目链接> <转载于 >>> > Problem Description CRB has N different candies. He is going ...

  3. Web轻量级扫描工具Skipfish

    Web轻量级扫描工具Skipfish 1. Skipfish 简介 2. Skipfish 基本操作 3.身份认证 一. Skipfish 简介 Skipfish是一款主动的Web应用程序安全侦察工具 ...

  4. setting.xml配置文件

    在此,简单的说下.  setting.xml 和 pom.xml这两各配置文件,到此是怎样? setting.xml setting.xml,这个配文件,是全局的. 比如你的是构建,web项目.我的是 ...

  5. PHP如何支持CURL字符串证书传输

    背景 最近在对接微信支付的时候,需要在退款处用到证书,由于我们是SAAS平台,要支持多方多渠道支付,如果把所有证书文件保存在应用服务器会受到SLB的影响,会导致某台机器文件不同步而阻碍退款流程,但把文 ...

  6. 【nodeJS爬虫】前端爬虫系列

    写这篇 blog 其实一开始我是拒绝的,因为爬虫爬的就是cnblog博客园.搞不好编辑看到了就把我的账号给封了:). 言归正传,前端同学可能向来对爬虫不是很感冒,觉得爬虫需要用偏后端的语言,诸如 ph ...

  7. MySQL中查询获取每个班级成绩前三名的学生信息

    CREATE TABLE t_testscore( pk_id INT PRIMARY KEY, c_name VARCHAR(50) , c_score INT, c_class INT )DEFA ...

  8. AGC027 D - Modulo Matrix 构造

    目录 题目链接 题解 代码 题目链接 AGC027 D - Modulo Matrix 题解 从第左上角第一个点开始染色,相邻不同色,染法唯一 那么一个点的四周与他不同色,我们另这个点比四周都大,那么 ...

  9. 《JavaScript-The Definitive Guide》读书笔记:函数定义和函数调用

    定义函数 使用function关键字来定义函数,分为两种形式: 声明式函数定义: function add(m,n) { alert(m+n); } 这种方式等同于构造一个Function类的实例的方 ...

  10. c# pictureBox1.Image的获得图片路径的三种方法 winform

    代码如下:c# pictureBox1.Image的获得图片路径的三种方法 winform 1.绝对路径:this.pictureBox2.Image=Image.FromFile("D:\ ...