HDU 3746 KMP 求最少需要在结尾后面补几个字符才能凑成至少两个循环
2013-11-02 10:46
381 查看
题意:
T个测试数据
对于每个字符串,问最少需要在结尾补几个字符可以凑成至少2个循环
思路:
最后一个字符对于的是 f【len-1】
而f【len】是表示 最后一个字符也和前面匹配了
所以f【len】就表示前缀与后缀的最大匹配,理解这个就方便做了
T个测试数据
对于每个字符串,问最少需要在结尾补几个字符可以凑成至少2个循环
思路:
最后一个字符对于的是 f【len-1】
而f【len】是表示 最后一个字符也和前面匹配了
所以f【len】就表示前缀与后缀的最大匹配,理解这个就方便做了
#include <stdio.h> #include <string.h> char P[200100];//从0开始存 int f[200100];//记录P的自我匹配 int len; void getFail(const char *p) //前缀函数(滑步函数) { int i = 0, j = -1; f[0] = -1; while(i != len) { if(j == -1 || p[i] == p[j]) //(全部不相等从新匹配 || 相等继续下次匹配) { ++i, ++j; if(p[i] != p[j]) //abcdabce f[i] = j; else //abcabca f[i] = f[j]; } else j = f[j]; //子串移动到第nextval[j]个字符和主串相应字符比较 } } int main(){ int T;scanf("%d",&T); while(T--){ scanf("%s",P); len = strlen(P); getFail(P); int lenth = len - f[len]; if(len != lenth && len % lenth == 0) { printf("0\n"); continue; } printf("%d\n", lenth - (f[len] % lenth)); } return 0; } /* 99 4 abab 6 ababab HDU 3336 必过 */
相关文章推荐
- HDU 3746 Cyclic Nacklace(KMP 最少需要在结尾后面补几个字符才能凑成两个循环)
- hdoj 3746 Cyclic Nacklace【KMP求在结尾加上多少个字符可以使字符串至少有两次循环】
- HDU 3746 将字符串的全部字符最少循环2次需要添加的字符数
- hdoj 3746 Cyclic Nacklace 【kmp 求至少在结尾添加多少个字符可以凑够至少两次循环】
- (KMP 1.4)hdu 3746 Cyclic Nacklace(使用next数组来求循环节的长度——求一个字符串需要添加多少个字符才能使该字符串的循环节的个数>=2)
- hdu 3746 Cyclic Nacklace(求最少添加几个字符使得字符串是由n(n>=2)个循环节组成的)
- HDU 3746 KMP的运用。【求字符串添加几个字符,可以成有循环节字符串】
- hdu_3746_kmp_给你一个字符串要求你添加最少的字符串使字符串最少循环两次
- hdu 3529 Bomberman - Just Search 重复覆盖+DLX 炸弹人游戏中,问最少需要放多少颗炸弹,才能够将所有的墙壁炸掉,其中,炸弹在同一时间引爆
- 最少需要删除多少个字符才能使字符串S变为回文串
- HDU 3746 Cyclic Nacklace(KMP最小循环子串)
- HDU 3746 Cyclic Nacklace 【KMP】(补充字符构成循环串)
- HDU 3746(Cyclic Nacklace)字符串匹配-KMP
- HDU 3746 Cyclic Nacklace (KMP求循环结)
- HDU-3746 Cyclic Nacklace(KMP求循环)
- hdu 1358 kmp 求前缀有几个循环
- 【HDU 3746】 Cyclic Nacklace 【KMP 求添加最小的个数使串循环】
- KMP(看毛片)- - 字符匹配问题 hdu 3746
- poj 1201 Intervals 差分约束系统+SPFA 给出一些区间, 告诉每个区间中至少需要取Ci个数。求出满足n个条件的集合C的最少的元素个数
- HDU 3746 Cyclic Nacklace (KMP 循环节)