SP34020 ADAPET - Ada and Pet 题解

题目传送门

前置知识

前缀函数与 KMP 算法

解法

经检验 样例,我们发现 \(|S|k\) 并不是最优答案。

考虑利用 luogu P4391 [BOI2009] Radio Transmission 无线传输 结论的逆命题,首先必须要有一个完整的 \(S\),然后将 \(|S|-next_{S}\) 复制 \(k-1\) 次即可。故 \(|S|+(|S|-next_{|S|})(k-1)\) 即为所求。

代码

#include<bits/stdc++.h>
using namespace std;
#define ll long long 
#define ull unsigned long long
#define sort stable_sort 
#define endl '\n'
ll nxt[500002];
char s[500002];
int main()
{
	ll t,n,m,i,j,k;
	scanf("%lld",&t);
	for(k=1;k<=t;k++)
	{
		scanf("%s%lld",s+1,&m);
		n=strlen(s+1);
		for(i=2,nxt[1]=j=0;i<=n;i++)
		{
			while(j>=1&&s[i]!=s[j+1])
			{
				j=nxt[j];
			}
			j+=(s[i]==s[j+1]);
			nxt[i]=j;
		}
		printf("%lld\n",n+(n-nxt[n])*(m-1));
	}
	return 0;
}
posted @ 2024-02-13 21:02  hzoi_Shadow  阅读(17)  评论(0编辑  收藏  举报
扩大
缩小