题解:反向用next数组求循环节(前i个字符的)即可。
题目:https://vjudge.net/problem/HDU-6740
#include<bits/stdc++.h>
#define ll long long
const int maxn=1e7+5;
char q[maxn];
char w[maxn];
int nex[maxn];
using namespace std;
void kmp()
{
int len=strlen(w);
int i=0,j=-1;
nex[0]=-1;
while(i<len)
{
if(j==-1||w[i]==w[j])
{
i++;
j++;
nex[i]=j;
}
else j=nex[j];
}
}
int main()
{
int a,b;
while(~scanf("%d%d\n",&a,&b))
{
memset(nex,0,sizeof(nex));
scanf("%s",q);
int len=strlen(q);
int cnt=0;
for(int i=len-1; i>=0; i--) ///反向
{
if(q[i]=='.')break;
w[cnt++]=q[i];
}
kmp();
ll ans=-0x3f3f3f3f;
for(int i=1; i<=cnt; i++)
{
ll t=1ll*a*i-1ll*b*(i-nex[i]); ///i-nex【i】:找规律。
ans=max(ans,t);
}
printf("%lld\n",ans);
}
}