HDU 3746 Cyclic Nacklace kmp处理字符串

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/hfuu1504011020/article/details/76573710
题意大致是说给你不同颜色的串珠,颜色用字母表示,之后让他形成一个环,循环至少两次,问至少需要加入几个串珠使之成立。
AC代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
const int MAX=1e5+10;
int Next[MAX];
int N,ans;
char str[MAX] ;
int str_len;
void kmp_next(char str[],int Next[])
{
	Next[0]=0;
	for(int i=1;i<str_len;i++)
	{
		int k=Next[i-1];
		while(k!=0&&str[i]!=str[k])
		   k=Next[k-1];
		if(str[i]==str[k]) Next[i]=k+1;
		else Next[i]=0;
	}
	
}
int main()
{
	    scanf("%d",&N);
		while(N--)
		{	
		memset(Next,0,sizeof(Next));
		scanf("%s",str);
		str_len=strlen(str);
		kmp_next(str,Next);
		int t=str_len-Next[str_len-1];//循环的长度
		if(Next[str_len-1]%t==0&&Next[str_len-1]!=0) ans=0;//例如aaa 可以多次循环
		else ans=t-(Next[str_len-1]%t);//例如abca 取余就是记录了后面循环的个数这里只有一个循环字母a
		printf("%d\n",ans);
		}
	return 0;
}
点击打开题目链接

猜你喜欢

转载自blog.csdn.net/hfuu1504011020/article/details/76573710
今日推荐