我又是我了!我不自閉了!
死磕了三四個小時忍住沒看題解,終於做出來了!…儘管這個題被大家稱爲水題…
思路:kmp求循環節,要求的循環節必須是在後綴中循環的,而我們正常求出的循環節,是在前綴中循環的,必須把我們的字符串倒過來求解。循環節的長度:i - nex[i]
當前循環的字符數:i
代碼:
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
typedef long long ull;
const int N = 1e7+10 , inf = 1e18;
int nex[N];
int n;
void get_next(string s)
{
for(int i=2,j=0;i<=n;i++)
{
while(s[i]!=s[j+1] && j)
j=nex[j];
if(s[i]==s[j+1]) j++;
nex[i]=j;
}
}
int main()
{
cin.tie(0);
ios::sync_with_stdio(false);
ull a,b;
string s;
while(cin>>a>>b)
{
cin>>s;
for(int i=0;i<s.size();i++)
if(s[i]=='.')
{
s=s.substr(i+1);break;
}
n=s.size();
reverse(s.begin(),s.end());
s=" "+s;
get_next(s);
ull ans=-inf;
for(int i=1;i<=n;i++)
{
ull len=i-nex[i],len2=i;
ans=max(ans,len2*a-len*b);
}
cout<<ans<<endl;
}
return 0;
}