HDU 3746 Cyclic Nacklace kmp处理字符串

本文介绍了一道关于串珠循环的算法题,并提供了一份详细的AC代码实现。该问题涉及字符串匹配,通过KMP算法预处理寻找最少需要增加的串珠数量来使序列能够循环至少两次。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题意大致是说给你不同颜色的串珠,颜色用字母表示,之后让他形成一个环,循环至少两次,问至少需要加入几个串珠使之成立。
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;
}
点击打开题目链接

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值