算法题:HDU 3746 Cyclic Nacklace(KMP,最短循环节)

链接:

http://acm.hdu.edu.cn/showproblem.php?pid=3746

题目大意:

给定一个字符串T, 在T后面添加x个字符串(让x最小),使得新字符串由前缀字串至少循环两次构 成的。

例如,

abca,  只需要再添加2个字母bc, 形成abcabc,就变成了由abc循环两次构成的。

分析与总结:

失配函数构造next数组的性质的应用,需要对这个有真正的理解。

对于长度为len的字符串,假设已经够造完了next数组,那么len-next[len]就是这个字符串的最小循 环节。

如果正好len%(len-next[len])==0就说明正好组成完成的循环。

否则,说明还需要再添加几个字母才能补全。

需要补的个数是循环个数len-next[len]-f[len]%(len-next[len]).

f[len]%(len-next[len])表示在最后一个循环节中已经构造了这么多个数。

代码:

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;  

const int MAXN = 100005;
char T[MAXN];
int  f[MAXN];  

void getFail(char* p,int* f){
    int n=strlen(p);
    f[0]=f[1]=0;
    for(int i=1; i<n; ++i){
        int j=f[i];
        while(j && p[i]!=p[j]) j=f[j];
        f[i+1] = p[i]==p[j]?1+j:0;
    }
}  

int main(){
    int nCase;
    scanf("%d",&nCase);
    while(nCase--){
        scanf("%s",T);
        int len=strlen(T);
        getFail(T, f);
        if(f[len] && len%(len-f[len])==0){
            puts("0");
        }
        else{
            int ans=(len-f[len])-f[len]%(len-f[len]);
            printf("%d\n",ans);
        }
    }
    return 0;
}

查看本栏目更多精彩内容:http://www.bianceng.cnhttp://www.bianceng.cn/Programming/sjjg/

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索数组
, 字符串
, include
, 循环
, 路径最短
, len
, 循环添加
, 个数
, 字符串测试acm数组
, 字符循环
最短
cyclic nacklace、nacklace、手游3746、rj173746解压密码、rj173746 王元姬,以便于您获取更多的相关知识。

时间: 2024-12-23 05:56:04

算法题:HDU 3746 Cyclic Nacklace(KMP,最短循环节)的相关文章

算法题之poj 1961 Period(KMP, 最短循环节)

题目链接: POJ  : http://poj.org/problem?id=1961 HDU : http://acm.hdu.edu.cn/showproblem.php?pid=1358 ZOJ   : http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=2177 题目大意: 给定一个长度为n的字符串s,求它的每个前缀的最短循环节.换句话说,对于每个i (2<=i<=n),求一个最大的整数K>1(如果K存在),使

hdu 3746 Cyclic Nacklace

点击打开链接hdu 3746 思路:kmp+字符串的最小循环节问题 分析: 1 题目要求的是给定一个字符串,问我们还需要添加几个字符可以构成一个由n个循环节组成的字符串. 2 可知我们应该先求出字符串的最小循环节的长度:假设字符串的长度为len,那么最小的循环节就是cir = len-next[len] ; 如果有len%cir == 0,那么这个字符串就是已经是完美的字符串,不用添加任何字符:如果不是完美的那么需要添加的字符数就是cir - (len-(len/cir)*cir)),相当与需要

算法题之HUST 1010 The Minimum Length(KMP,最短循环节点)

链接: http://acm.hust.edu.cn/problem.php?id=1010 题目: Description There is a string A. The length of A is less than 1,000,000. I rewrite it again and again. Then I got a new string: AAAAAA...... Now I cut it from two different position and get a new str

算法题:HDU 2594 Simpsons’ Hidden Talents(KMP)

链接: http://acm.hdu.edu.cn/showproblem.php?pid=2594 题目大意: 给两个字符串s1和s2, 求出是s1的前缀并且是s2的后缀的最长的字符串. 分析与总结: 真正理解好KMP算法,这题就是水题. 首先求出s1的失配函数,然后在s2中 寻找s1字符串. 在寻找字符串过程中,会有一个状态值j,这个值表示的是当前在s2中已经匹配 了多少个s1的字符. 所以,全部匹配完后,最后j的值就是以s2的最后一个字符结尾,和s1的前缀相匹 配的最长字符串.也就是所求的

算法题:poj 2541 Binary Witch(KMP水过,逆序转换)

链接: http://poj.org/problem?id=2541 分析与总结: 做这题估算了下复杂度,觉得无论KMP再怎么快,这题暴力也肯定要超时的. 想了很久也没想出个好办法,于是决定暴力之,但是TLE了....于是就放了几天.之后看了下discuss ,这题的正解应该是状态压缩dp,不过目前我还不懂,跪了. 之后百度发现也可以用KMP水过,虽然是因为数据水才过的,不过这种思路很巧妙,值得借鉴! 直接暴力是枚举字符串的后面13个的字母,然后再用KMP匹配,这样的话,就绪要枚举多次,分别是

经典算法题每日演练——第七题 KMP算法

原文:经典算法题每日演练--第七题 KMP算法       在大学的时候,应该在数据结构里面都看过kmp算法吧,不知道有多少老师对该算法是一笔带过的,至少我们以前是的, 确实kmp算法还是有点饶人的,如果说红黑树是变态级的,那么kmp算法比红黑树还要变态,很抱歉,每次打kmp的时候,输 入法总是提示"看毛片"三个字,嘿嘿,就叫"看毛片算法"吧. 一:BF算法      如果让你写字符串的模式匹配,你可能会很快的写出朴素的bf算法,至少问题是解决了,我想大家很清楚的知

算法:hdu 4558 剑侠情缘(dp, 西山居复赛1第2题)

思路: 这是刚练dp后做比赛遇到的第一道dp题 比赛时想了一个状态转移方程,f[i][j] [k][l][2], i和j表示在第i行j列, k和l表示人和剑的能量,最后一维0表示当前这个能量给人补充,1表示 给剑补充转移为: f[i][j][k][l][0] = f[i-1][j][k-mat[i][j]][l][1]+f[i][j-1][k-mat [i][j]][l][1];f[i][j][k][l][1] = f[i-1][j][k][l-mat[i][j]][0]+f[i][j-1][k

算法题:poj 2752 Seek the Name, Seek the Fame(理解KMP的失配函数!)

链接: http://poj.org/problem?id=2752 题目大意: 给一个字符串S, 求出所有前缀pre,使得这个前缀也正好是S的后缀. 输出所有前缀的结束位置. 例如 "ababcababababcabab", 以下这些前缀也同时是S的后缀 ab  :  位置2 abab  : 位置4 ababcabab : 位置9 ababcababababcabab : 位置 18 分析与总结: 这题,关键在于对KMP的失配函数的理解.只要真正理解了,那么做出来完全不成问题. 下面

算法题:uva 1330

题目链接: http://uva.onlinejudge.org/index.php? option=com_onlinejudge&Itemid=8&category=460&page=show_problem&problem=4076 以前做过一道一维的,这题只是变成了二维的,其他方法都一样.HDU 1506  Largest Rectangle in a Histogram   题解 代码1: #include<cstdio> #include<cs