见鬼了
  • 板块灌水区
  • 楼主whileAK
  • 当前回复2
  • 已保存回复2
  • 发布时间2024/5/18 17:57
  • 上次更新2024/5/18 20:25:46
查看原帖
见鬼了
817925
whileAK楼主2024/5/18 17:57

输入

1
abrahellehhelleh

这份代码在本地运行会RE,打开注释后本地就能正常输出了,交洛谷上可以正常运行,有强神解释下吗,本地用的是Windows。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
void rd(int &p){
    int f=1;p=0;char c=getchar();
    while(c>'9'||c<'0'){if(c=='-')f=-f;c=getchar();}
    while(c>='0'&&c<='9')p=(p<<1)+(p<<3)+c-'0',c=getchar();
    p*=f;
}
void rdl(ll &p){
    ll f=1;p=0;char c=getchar();
    while(c>'9'||c<'0'){if(c=='-')f=-f;c=getchar();}
    while(c>='0'&&c<='9')p=(p<<1)+(p<<3)+c-'0',c=getchar();
    p*=f;
}
const int N=1e6+50;
namespace A{
	int n,f[N],s[N],ans(0);char a[N],c[N];
	void solve(){
		scanf("%s",a+1);n=strlen(a+1);
		c[0]='#';ans=0;
		for(int i(1);i<=n;++i){
			c[i*2-1]='&';c[i*2]=a[i];
		}n=n*2+1;c[n]='&';c[n+1]='?';
		for(int i(1);i<=n;++i)s[i]=0,f[i]=0;
//		for(int i(1);i<=n;++i)cout<<f[i]<<' ';cout<<endl;
//		for(int i(1);i<=n;++i)cout<<s[i]<<' ';cout<<endl;
		for(int i(1),r,mid;i<=n;++i){
			if(r>=i)f[i]=min(r-i,f[2*mid-i]);
			while(c[i+f[i]+1]==c[i-f[i]-1])++f[i];
			if(i+f[i]>r)r=i+f[i],mid=i;s[i+f[i]]=max(s[i+f[i]],f[i]);
		}
		for(int i(n-1);i;--i)s[i]=max(s[i],s[i+1]-1);
		for(int i(1);i<=n;++i){
			if(c[i-s[i]]=='&'&&c[i]=='&'){
				if(c[i+i-s[i]>>1]=='&'&&f[i+i-s[i]>>1]+(i+i-s[i]>>1)>=i)ans=max(ans,s[i]);
			}
		}
		printf("%d\n",ans);
	}
}
int main(){
	int t;rd(t);
	while(t--)A::solve();
    return 0;
}
2024/5/18 17:57
加载中...