码迷,mamicode.com
首页 > 其他好文 > 详细

[bzoj1355][Baltic2009]Radio Transmission_KMP

时间:2018-03-22 22:36:00      阅读:146      评论:0      收藏:0      [点我收藏+]

标签:而不是   ios   int   sans   技术分享   它的   out   char s   pac   

Radio Transmissio bzoj-1355

Description

    给你一个字符串,它是由某个字符串不断自我连接形成的。 但是这个字符串是不确定的,现在只想知道它的最短长度是多少.

Input

    第一行给出字符串的长度,1 < L ≤ 1,000,000. 第二行给出一个字符串,全由小写字母组成.

Output

    输出最短的长度.
    想法:结论题,输出len-next[len]即可。证明是容易的:技术分享图片

 

    我们假设红色对角线字符子串是我们想要得到的字符串长度。蓝线是题目字符串截至位置。绿色字符串是除去答案字符串的长度。那么我们如何求出答案长度呢?显然,我们用next求出最长前缀后缀,然后相减即可。题目中的最长前缀后缀是上面扩出的两个字符串

    最后,附上丑陋的代码... ...

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
char s[1001000];
int next[1001000];
int len;
void GetNext()
{
	int j=0,k=-1;
	next[0]=-1;
	while(j<len)
	{
		if(k==-1||s[j]==s[k])
		{
			k++;j++;
			next[j]=k;
		}
		else k=next[k];
	}
}
int main()
{
	scanf("%d",&len);
	scanf("%s",s);
	GetNext();
	printf("%d\n",len-next[len]);
}

     小结:KMP的精髓在于数组的灵活应用,而不是KMP本身

[bzoj1355][Baltic2009]Radio Transmission_KMP

标签:而不是   ios   int   sans   技术分享   它的   out   char s   pac   

原文地址:https://www.cnblogs.com/ShuraK/p/8626670.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!