串珠子

  题目大意:给定一个字串,要你找到如果要使之成为循环串,在末尾需要的最小的字数(只能添加字符,不能删减字符)

  首先联动一下之前做过的动态规划问题POJ 3280,当然了3280这一题是用的LD,因为他可以添加或者删除(加上修改也行,但是要改状态方程了)

  而我们现在要讨论的这一题(HDU 3746)是有限制的,首先它只能添加不能删除,其次一定是要在末尾添加。

  其实这样的题用kmp可以很快地解决,其实这样的题目是循环节的题目,之前我已经写过很多了,这一题是对循环节的深刻理解。

  首先我们我们明白,对于kmp算法的next数组,如果一个字串是循环字串,那么他一定有len%(len-next[len])==0且next[len]>0,这个已经从1961等题论证了

  现在我们就是要搞清楚,如果len%(len-next[len])!=0会如何,我们先来看一个例子

  

  比如上个例子,他的最大前缀和后缀是abcdeabcd,如果要在末尾加上字符使他循环,那么一定是要加上e,使新的循环节是abcde,而abcde的长度刚好是len-next[len]

  

  再如这个例子,最大前缀和后缀是abcabcab,末尾加上c循环节就是abc,刚好也是len-next[len]

  

  对于这个,不存在最大前后缀,必须加上len才能使之成为循环字串,而next[len]刚好是0,也符合len-next[len]

  那么我们是不是能下结论,无论对于什么字串,无论是否循环,最小的循环节一定是len-next[len]呢?答案是最小循环节一定满足这个结论

  我们再来看第二组

  我们把最大前后缀对齐,发现突出的部分的长度就是新的数组的循环节的长度,事实上,我们将任何数组按照这个方式对齐都有这个结论,就是突出的长度刚好是新的数组的循环节的长度,而这个长度刚好就是len-next[len](非严格证明),那么原数组按照新的循环节划分会剩下len%(len-next[len])个单元(注意len-next[len]要特判,因为可能会存在len-next[len]==0),接着我们就可以直接用len-len%(len-next[len])得到需要补齐的长度了,这就是循环节题目的一般做法。  

  参考:http://blog.csdn.net/u013480600/article/details/22954037

 #include <iostream>
#include <algorithm>
#include <functional>
#include <string.h> using namespace std; static char input[];
static int _Next[]; void Get_Next(const int); int main(void)
{
int case_sum, len;
scanf("%d", &case_sum); while (case_sum--)
{
scanf("%s", input);
len = strlen(input);
Get_Next(len); if (_Next[len] == )//不存在循环节
printf("%d\n", len);
else if (len % (len - _Next[len]) == )//已经是循环节了
printf("0\n");
else
printf("%d\n", len - _Next[len] - len % (len - _Next[len]));
}
return EXIT_SUCCESS;
} void Get_Next(const int len)
{
int i = , k = -;
_Next[] = -; while (i < len)
{
if (k == - || input[i] == input[k])
{
i++;
k++;
_Next[i] = k;
}
else k = _Next[k];
}
}

  

Match:Cyclic Nacklace(KMP的next数组的高级应用)(HDU 3746)的更多相关文章

  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. hdu3746 Cyclic Nacklace KMP

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

  3. hdu 3746 Cyclic Nacklace KMP循环节

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

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

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

  5. HDU 3746 Cyclic Nacklace (KMP找循环节)

    题目链接:HDU 3746 Sample Input 3 aaa abca abcde Sample Output 0 2 5 Author possessor WC Source HDU 3rd & ...

  6. HDU 3746 Cyclic Nacklace KMP

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

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

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

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

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

  9. HDU_3746 Cyclic Nacklace(KMP)

    题目请点我 题解: 题目大意:有一个字符串s.能够在前后加入字符,使字符串成为一个循环次数至少为2的循环字符串.输出最少须要加入的字符数目. 首先能够证明题目能够等价为仅仅在末尾加入字符使满足题意.要 ...

随机推荐

  1. 密码学初级教程(五)消息认证码MAC-Message Authentication Code

    密码学家工具箱中的6个重要的工具: 对称密码 公钥密码 单向散列函数 消息认证码 数字签名 伪随机数生成器 MAC能识别出篡改和伪装,也就是既可以确认消息的完整性,也可以进行认证. 消息认证码的输入包 ...

  2. 繁华模拟赛day8 字典序

    /* 这个题要我们求一个字典序,字符串给出的顺序,会对字母的字典序前后相对顺序进行限定,如何用来表示这种限定,我们注意到这种一个之后接着一个,只有先输出他前面的才能输出他,很明显就是拓扑排序,最小方案 ...

  3. Ubuntu 12 升级 SVN 1.6 到 1.8 版本

    在 Ubuntu 12 中使用 PhpStorm 10.x,CheckOut项目后,Event Log 提示: Subversion command line client version is to ...

  4. EF接触03

    emdx文件解读:

  5. linux下用Apache一个IP多个域名建虚拟主机

    如有两个域名,分别是hello.abc.com和play.abc.com,需把这两个域名都绑定到 IP是219.13.34.32的服务器上 1.首先需在域名供应商管理页面指定域名和IP的对应关系 2. ...

  6. Unity3D引擎扩展中的编辑器定制方法

    http://gamerboom.com/archives/36432 作者:Richard Fine Unity3D的方便之处在于,它很容易地扩展编辑器套件.每款游戏都对加工有着不同的需求,可以快速 ...

  7. ionic中返回上一页

    .controller('NewsCtrl', ["$scope", "$ionicHistory", "$http","$tim ...

  8. Android6.0以后动态增加权限

    private void test() throws IOException { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { in ...

  9. android之inflater用法

    在实际开发中LayoutInflater这个类还是非常有用的,它的作用类似于findViewById().不同点是LayoutInflater是用来找res/layout/下的xml布局文件,并且实例 ...

  10. phpcms评论的url替换问题

    在整个项目改ip之前,评论里的url是127.0.1.113 改成localhost之后,更新了所有的url和缓存,但是v9_comment表中的url字段没有更新. 想一下后台只有一个地方是替换数据 ...