玄关,wa on #3求助正确性
查看原帖
玄关,wa on #3求助正确性
1015770
Arteg楼主2024/10/7 17:08

虽然是暴力,但#3答案一直不对,不知道正确性哪里有误。

/*
 前之君待,湿露月九。
 问有我无,谁为方彼。
*/
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define ld long double
#define lb(x) (x&-x)

const int maxn=10000010;
const int mo=1000000007;
const int inf=0x3f3f3f3f3f3f3f3f;

inline int read(){
	int x=0,f=1;
	char ch=getchar();
	while(ch<'0'||ch>'9'){
		if(ch=='-')
			f=-1;
		ch=getchar();
	}
	while(ch>='0'&&ch<='9'){
		x=(x<<1)+(x<<3)+(ch^48);
		ch=getchar();
	}
	return x*f;
}

void write(int x){
	if(x<0)
		x=-x;
	if(x>9)
		write(x/10);
	putchar(x%10+'0');
	return ;
}

int n,h[maxn],ans;

char s[maxn];

signed main(){
//	freopen("sjj.out","r",stdin);
//	freopen("sb.out","w",stdout);
	read();
	char ch=getchar();
	while(ch<'a'||ch>'z')
		ch=getchar();
	while(ch>='a'&&ch<='z'){
		s[++n]=ch;
		s[++n]='|';
		ch=getchar();
	}
	s[0]='|';
	int l,r=0,mid=0;
	for(int i=1;i<=n;i++){
		if(i<r){
			h[i]=min(h[(mid<<1)-i],r-i+1);
			if(h[i]==r-i+1){
				for(int j=h[i]+1;i+j-1<=n&&i-j+1>=0;j++){
					if(s[i+j-1]!=s[i-j+1])
						break;
					h[i]=j;
				}				
			}
		}
		else
			for(int j=1;i+j-1<=n&&i-j+1>=0;j++){
				if(s[i+j-1]!=s[i-j+1])
					break;
				h[i]=j;
			}
		if(i+h[i]-1>r){
			r=i+h[i]-1;
			mid=i;
		}
	}
  for(int i=2;i<=n;i+=2){
    int ccc=h[i];
    ccc--;
    if(ccc%4!=0)
      ccc-=2;
    for(int len=ccc;len>=0;len-=4){
      int m1=i-(len>>1);
      if(h[m1]==((len>>1)+1))
        ans=max(ans,len);			
    }
  }		
	printf("%lld\n",ans);
	return 0;
}

2024/10/7 17:08
加载中...