大致翻了一下题解,似乎没有看见和我做法相同的。
如果有,那就是我眼瞎了,请告诉我,我会紫衫。
思考了一会儿后并没有想出正确性的证明。
如果能有 hack 数据,也是可以的。
我的大致思路是,你观察合法的序列,你会发现在 3n 处的前缀函数值就应该是合法的答案之一。当然具体行不行后面判一下就行了。可以看一下下图(图有点简陋请见谅):

代码如下:
// 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;
}
十分感谢!