HDU 3746 KMP
来源:互联网 发布:男主是程序员的小说 编辑:程序博客网 时间:2024/06/05 10:54
题意
N个字符串,要使字符串为其字串的循环,问最少要添加多少个字符。
题解
看了题解才意识到这是一道非常水的KMP题,不过对KMP的理解一定要深入。KMP算法的原理就是判断是否存在重复的部分,如果存在重复的部分,则在比对的时候就可以避免比对重复的部分。这个性质也正好可以用来判断循环串的长度。M-第M+1个位置的失配数就是循环串的长度。算出来以后,答案就显而易见了。
关于KMP的模板,感觉刘汝佳的KMP模板还是不错的,非常值得参考。
代码
#include <iostream>#include<cstdio>#include<algorithm>#include<cstring>#include<vector>#include<cmath>#include<queue>#include<string>#include<set>#include<map>#include<bitset>#define UP(i,l,h) for(int i=l;i<h;i++)#define DOWN(i,h,l) for(int i=h-1;i>=l;i--)#define W(a) while(a)#define INF 0x3f3f3f3f#define LL long long#define MAXN 15#define EPS 1e-10#define MOD 100000000using namespace std;char p[100010];int f[100010];int n,m;void getFail() { f[0]=0,f[1]=0; UP(i,1,m) { int j=f[i]; W(j&&p[i]!=p[j]) { j=f[j]; } f[i+1]=p[i]==p[j]?j+1:0; }}int main() { int kase; scanf("%d",&kase); W(kase--) { scanf("%s",p); m=strlen(p); getFail(); int len=m-f[m]; if(len!=m&&m%len==0) puts("0"); else printf("%d\n",len-f[m]%len); }}
阅读全文
0 0
- 【KMP】HDU 3746
- KMP HDU 3746
- HDU 3746 KMP
- hdu 3746 (kmp)
- HDU 3746 (KMP)
- 字符串 KMP HDU 3746
- HDU 3746 KMP
- KMP hdu-3746-Cyclic Nacklace
- HDU 3746 Cyclic Nacklace(KMP)
- HDU 3746 Cyclic Nacklace KMP
- HDU 3746 Cyclic Nacklace KMP
- HDU 3746 Cyclic Nacklace KMP
- 【HDU 3746 KMP之next】
- 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】
- 亲身经历唐山大地震的人生感悟
- hpu暑假训练C
- UVA699-例题6-10 下落的树叶(The Falling Leaves,UVa 699)
- curl_init()和curl_multi_init()多线程的速度比较
- 当加载一个动态库时,可能因为这个动态库依赖于其他的动态库,而加载他的时候找到这个动态库之后默认到系统盘去找其依赖的动态库而导致没有找到其 依赖的动态库。
- HDU 3746 KMP
- IOC容器的简单介绍
- 【QT】QPA
- 定制自己的Unity场景编辑工具界面(一)
- android 检测USB是U盘还是外设
- 面试题
- HDU 2017 多校联赛2 1011 Regular polygon
- CF766E:Mahmoud and a xor trip(树形dp)
- SpringBoot使用Ckediter上传图片