ABC284F 神奇做法求证明或 hack
查看原帖
ABC284F 神奇做法求证明或 hack
1223312
yzljy楼主2024/11/12 21:26

大致翻了一下题解,似乎没有看见和我做法相同的。
如果有,那就是我眼瞎了,请告诉我,我会紫衫。

思考了一会儿后并没有想出正确性的证明。
如果能有 hack 数据,也是可以的。

我的大致思路是,你观察合法的序列,你会发现在 3n3n 处的前缀函数值就应该是合法的答案之一。当然具体行不行后面判一下就行了。可以看一下下图(图有点简陋请见谅):

代码如下:

// Problem: [ABC284F] ABCBAC
// Contest: Luogu
// URL: https://www.luogu.com.cn/problem/AT_abc284_f
// Memory Limit: 1 MB
// Time Limit: 2000 ms
// 
// Powered by CP Editor (https://cpeditor.org)

#include<bits/stdc++.h>
using namespace std;
const int MAXN=1e6+10;
const int mod1=1e9+7;
const int mod2=998244353;
const int inf_int=0x7f7f7f7f;
const long long inf_long=0x7f7f7f7f7f7f7f7f;
const double eps=1e-9;
char Buf[1<<23],*P1=Buf,*P2=Buf;
#define getchar() (P1==P2&&(P2=(P1=Buf)+fread(Buf,1,1<<23,stdin),P1==P2)?EOF:*P1++)
template<typename type>
inline void read(type &x){
	x=0;
	bool f=false;
	char ch=getchar();
	while(ch<'0'||ch>'9') f|=ch=='-',ch=getchar();
	while(ch>='0'&&ch<='9') x=x*10+(ch^48),ch=getchar();
	if(f) x=-x;
}
template<typename type,typename... args>
inline void read(type &x,args&... y){
	read(x),read(y...);
}

int n,pi[MAXN<<2];
string s,ans;

void KMP(string str){
	for(int i=1;i<=str.length();i++) pi[i]=0;
	for(int i=2,j=0;i<=str.length();i++){
		while(j&&str[i-1]!=s[j]) j=pi[j];
		if(str[i-1]==s[j]) j++;
		pi[i]=j;
	}
}

signed main(){
	cin>>n>>s;
	s+='#';
	for(int i=s.length()-2;i>=0;i--) s+=s[i];
	KMP(s);
	for(int i=n+pi[3*n+1]-1;i>=pi[3*n+1];i--) ans+=s[i];
	for(int i=0;i<pi[3*n+1];i++){
		if(s[i]!=ans[i]){
			cout<<-1;
			return 0;
		}
	}
	for(int i=n-1;i>=0;i--){
		if(s[n-1-i+pi[3*n+1]]!=ans[i]){
			cout<<-1;
			return 0;
		}
	}
	for(int i=pi[3*n+1];i<n;i++){
		if(s[n+i]!=ans[i]){
			cout<<-1;
			return 0;
		}
	}
	cout<<ans<<'\n'<<pi[3*n+1];
	return 0;
}

十分感谢!

2024/11/12 21:26
加载中...