当前位置: 移动技术网 > IT编程>开发语言>C/C++ > J - MUV LUV EXTRA

J - MUV LUV EXTRA

2020年08月10日  | 移动技术网IT编程  | 我要评论
J - MUV LUV EXTRA思路:kmpkmpkmp。求小数点后面的翻转字符串的循环节和循环长度。注意循环节长度为1时,答案是a−ba-ba−b.时间复杂度:O(n)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,

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

如您对本文有疑问或者有任何想说的,请 点击进行留言回复,万千网友为您解惑!

相关文章:

验证码:
移动技术网