社区讨论

WA on #46求助

CF30ETricky and Clever Password参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@lq67io1f
此快照首次捕获于
2023/12/15 13:46
2 年前
此快照最后确认于
2023/12/15 17:31
2 年前
查看原帖
CPP
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=100005;
const int Base=1145141;
const int Mod=998244353;
int n;
int len[N],d[N];
int pre[N],suf[N],PowBase[N];
int Log[N],f[N][18],g[N][18];
char a[N>>1];
vector<pair<int,int> > vec;
int getpre(int l,int r){
	return (pre[r]-pre[l-1]*PowBase[r-l+1]%Mod+Mod)%Mod;
}
int getsuf(int l,int r){
	return (suf[l]-suf[r+1]*PowBase[r-l+1]%Mod+Mod)%Mod;
}
void init(){
	for(int j=1;(1<<j)<=n;j++){
		for(int i=1;i+(1<<j)-1<=n;i++){
			if(f[i][j-1]>f[i+(1<<j-1)][j-1]) f[i][j]=f[i][j-1],g[i][j]=g[i][j-1];
			else f[i][j]=f[i+(1<<j-1)][j-1],g[i][j]=g[i+(1<<j-1)][j-1];
		}
	}
}
int query(int l,int r){
	int _Log=Log[r-l+1];
	return max(f[l][_Log],f[r-(1<<_Log)+1][_Log]);
}
int pos(int l,int r){
	int _Log=Log[r-l+1];
	if(f[l][_Log]>f[r-(1<<_Log)+1][_Log]) return g[l][_Log];
	else return g[r-(1<<_Log)+1][_Log];
}
signed main(){
	//freopen(".in","r",stdin);
	//freopen(".out","w",stdout);
	scanf("%s",a+1);
	n=strlen(a+1);
	Log[0]=-1;
	for(int i=1;i<=n;i++) Log[i]=Log[i>>1]+1;
	PowBase[0]=1;
	for(int i=1;i<=n;i++) PowBase[i]=PowBase[i-1]*Base%Mod;
	for(int i=1;i<=n;i++) pre[i]=(pre[i-1]*Base%Mod+a[i]-'a')%Mod;
	for(int i=n;i>=1;i--) suf[i]=(suf[i+1]*Base%Mod+a[i]-'a')%Mod;
	for(int i=1;i<=n;i++){
		int l=1,r=(n-i)/2,x=0;
		while(l<=r){
			int mid=(l+r)>>1;
			if(getpre(i,i+mid-1)==getsuf(n-mid+1,n)) x=mid,l=mid+1;
			else r=mid-1;
		}
		len[i]=x;
	}
	int l=0,r=0;
	for(int i=1;i<=n;i++) d[i]=1;
	for(int i=1;i<=n;i++){
		if(i<=r) d[i]=min(d[l+r-i],r-i+1);
		while(i+d[i]<=n&&i-d[i]>=1&&a[i+d[i]]==a[i-d[i]]) d[i]++;
		if(i+d[i]-1>r){
			l=i-d[i]+1;
			r=i+d[i]-1;
		}
		f[i][0]=d[i];
		g[i][0]=i;
	}
	init();
	int ans=0;
	for(int i=1;i<=n;i++){
		int L=i+len[i],R=n-len[i];
		int l=1,r=(R-L)/2+1,x=0;
		while(l<=r){
			int mid=(l+r)>>1;
			if(query(L+mid-1,R-mid+1)>=mid) x=mid,l=mid+1;
			else r=mid-1;
		}
		if(2*len[i]+2*x-1>ans){
			vec.clear();
			ans=2*len[i]+2*x-1;
			if(!len[i]) vec.push_back(make_pair(pos(L+x-1,R-x+1)-x+1,2*x-1));
			else{
				vec.push_back(make_pair(i,len[i]));
				vec.push_back(make_pair(pos(L+x-1,R-x+1)-x+1,2*x-1));
				vec.push_back(make_pair(n-len[i]+1,len[i]));
			}
		} 
	}
	printf("%lld\n",(int)vec.size());
	for(int i=0;i<vec.size();i++) printf("%lld %lld\n",vec[i].first,vec[i].second);
	return 0;
}

回复

0 条回复,欢迎继续交流。

正在加载回复...