欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

J - MUV LUV EXTRA

程序员文章站 2022-07-07 08:31:06
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

思路:kmpkmp

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

注意循环节长度为1时,答案是aba-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;
}

本文地址:https://blog.csdn.net/weixin_45750972/article/details/107855871

相关标签: kmp 字符串