hdu3746 Cyclic Nacklace

本文介绍如何使用KMP算法解决寻找最短周期循环字符串的问题,并提供了一段C++实现代码。通过构造Next数组来确定给定字符串的周期,进而计算出所需的最少字符补充数量。

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

       看好半天才明白题意。题目大意是说给定一个串,需要在两端加上一些字符,求最少加上多少字符可以使得这个串成为周期循环串。由于要构成环,所以在两端加字符和在一端加其实没什么区别,于是我们只考虑在右端加字符。其实这就是KMP算法中的Next表的应用,所以需要很好的理解Next表格的含义。

        先来回顾下Next[j]的含义。设模式串为P[0...m-1],则Next[j]表示P的前缀串P[0...j-1]的前缀与后缀匹配的最大长度。也可以理解为p的长度为 j 的前缀子串的前缀与后缀匹配的最大长度。设 t =Next[j],于是有P[0..t-1]==P[j-t...t-1]。我们算出这个条件是构成周期串的重要信息。结果会发现如果长度为 j 的字串要构成周期串,那么周期最小长度为 j-t 。在考虑整个字串时。我们要算出Next[m] .则构成循环串的最小周期为 T=m - Next[m]. 需要补加最少字符数位 (T-m%T)%T个,当然Next[m]==0时情况要单独考虑。

#include<iostream>
using namespace std;
int Next[100003];
char p[100002];
int main(){
	int i, j, T, m, ans;
	scanf("%d",&T);
	Next[0] = -1;
	while (T--){
		scanf("%s",p);
		m =strlen(p);
		for (i = 1; i <= m; i++){
			j = Next[i - 1];
			while (j != -1 && p[i - 1] != p[j])
				j = Next[j];
			Next[i] = j + 1;
		}
		j = m - Next[m];
		if (j == m)         //题目要求至少2个周期,j==m表示Next[m]==0
			ans = m;
		else
			ans = (j - m%j) % j;
		printf("%d\n", ans);
	}
	return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值