前置知识
解法
经检验 样例,我们发现 \(|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;
}
标签:nxt,Pet,题解,ll,long,ADAPET,define
From: https://www.cnblogs.com/The-Shadow-Dragon/p/18014819