您的位置:首页 > 其它

HDU-3746-KMP理解失配

2015-08-14 16:45 330 查看
这个有点意思,要理解失配数组

题意是要计算出需要构造成循环节相连的最小个数

利用失配构造函数求出单个循环节,然后计算出需要的加上的珠子个数

#include <cstdio>
#include <algorithm>
#include <cstring>
#include <ctype.h>
#include <cstdlib>
#include <stack>
#include <set>
#include <map>
#include <queue>
#include <string>
#include <cmath>

using namespace std;

int T;
char P[100100];

int solve(char *P)
{
int m = (int)strlen(P);
int f[m+10];
memset(f,-1,sizeof f);
int i = 0,j = -1;
while(i != m)
{
if(j == -1||P[i] == P[j])
f[++i] = ++j;
else
j = f[j];
}
int k = m-f[m];
return (k != m && f[m]%k==0) ? 0 : k-f[m]%k;
}

int main()
{
scanf("%d",&T);
while(T--)
{
scanf("%s",P);
printf("%d\n",solve(P));
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: