J - MUV LUV EXTRA

J - MUV LUV EXTRA

思路: k m p kmp

求小数点后面的翻转字符串的循环节和循环长度。

注意循环节长度为1时,答案是 a b a-b .

时间复杂度: O ( n ) O(n)

#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;
}

猜你喜欢

转载自blog.csdn.net/weixin_45750972/article/details/107855871