J - MUV LUV EXTRA
程序员文章站
2022-04-16 19:13:22
J - MUV LUV EXTRA思路:kmpkmpkmp。求小数点后面的翻转字符串的循环节和循环长度。注意循环节长度为1时,答案是a−ba-ba−b.时间复杂度:O(n)O(n)O(n)#includeusing namespace std;typedef long long ll;const int N=1e7+5,M=2e4+5,inf=0x3f3f3f3f,mod=998244353;#define mst(a,b) memset(a,b,...
J - MUV LUV EXTRA
思路:。
求小数点后面的翻转字符串的循环节和循环长度。
注意循环节长度为1时,答案是.
时间复杂度:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e7+5,M=2e4+5,inf=0x3f3f3f3f,mod=998244353;
#define mst(a,b) memset(a,b,sizeof a)
#define lx x<<1
#define rx x<<1|1
#define reg register
#define PII pair<int,int>
#define fi first
#define se second
#define pb push_back
int f[N];
ll a,b;
char s[N],t[N];
void kmp(char *s,int n){
int j=0;
for(int i=1;i<n;i++){
while(j&&s[i]!=s[j]) j=f[j-1];
if(s[i]==s[j]) j++;
f[i]=j;
}
}
int main(){
scanf("%lld%lld%s",&a,&b,s);
int k=0,n=strlen(s);
for(int i=n-1;s[i]!='.';i--) t[k++]=s[i];
kmp(t,k);
ll ans=a-b;
for(int i=0;i<k;i++){
ans=max(ans,a*(i+1)-b*(i+1-f[i]));
}
printf("%lld\n",ans);
return 0;
}
本文地址:https://blog.csdn.net/weixin_45750972/article/details/107855871