首页 > 其他 > 详细

HDU 3746 Cyclic Nacklace / KMP

时间:2014-03-25 16:13:11      阅读:452      评论:0      收藏:0      [点我收藏+]

首先 t = n-next[n]是周期 n是字符串长度 如果 n%t = =0 那么该字符串是一个周期串

如果n%t !=0  t还是周期 只不过末尾多一部分 话句话说 该字符串是由若干个t和一段字符x组成 如果没有x那么它就是一个周期串 并且x和t的开头是相同的 就是x是t的前缀

那么x的长度是多少呢 是n%t

既然x是t的前缀 就满意补上一些字符使x变成t 补多少字符呢 t-n%t , t= n-next[n];

#include <cstdio>
#include <cstring>
const int maxn = 200010;
const int mod = 10007;
char a[maxn];
int f[maxn];
int dp[maxn];
int n, m;

void getFail()
{
	f[0] = f[1] = 0;
	for(int i = 1; i < n; i++)
	{
		int j = f[i];
		while(j && a[i] != a[j])
			j = f[j];
		f[i+1] = a[i] == a[j] ? j+1 : 0;
	}
	if(f[n] == 0)
	{
		printf("%d\n", n);
		return;
	}
	if(n%(n-f[n]) == 0)
	{
		printf("0\n");
		return;
	}
	printf("%d\n", n-f[n]-n%(n-f[n]));
}
int main()
{
	int T;
	scanf("%d", &T);
	while(T--)
	{
		m = 0;
		scanf("%s", a);
		n = strlen(a);
		getFail();
	}
	return 0;
}


 

 

HDU 3746 Cyclic Nacklace / KMP,布布扣,bubuko.com

HDU 3746 Cyclic Nacklace / KMP

原文:http://blog.csdn.net/u011686226/article/details/22052757

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!