CSP-S 2021 T3 palin 愚蠢的做法
AThousandSuns · · 个人记录
我们来看看这个小丑在考场上都推了些什么破东西,结果还有边界情况没考虑挂分了,还导致 T4 没调出来,身败名裂。
前排提示:只是想知道这题怎么做的可以不用看。
既然是回文,比较直接的想法是枚举前
下文把
那么我们只需要枚举窗口,就可以贪心求。从前缀和后缀的开始部分贪心取(先试前缀再试后缀),要求在窗口里已取的对应的永远是一个区间。
这时时间复杂度是
现在我们考虑如果
用定义瞎推推,有
如果
因为
然后我们发现窗口
如果有解,再考虑两个答案的结构。窗口 R 把 R 中间就操作肯定不如放到最后)。而窗口 L 把
所以说,窗口
那么现在只有三种可能的最优解:窗口
时间复杂度
考场代码写的不知道什么鬼,稍微改得能看了一点,也不用想着有多好看。
#include<bits/stdc++.h>
#define FNAME "palin" // remember!
using namespace std;
const int maxn=1111111,mod=998244353; // remember!
#define PB push_back
#define MP make_pair
#define FOR(i,a,b) for(int i=(a);i<=(b);i++)
#define ROF(i,a,b) for(int i=(a);i>=(b);i--)
#define MEM(x,v) memset(x,v,sizeof(x))
inline int read(){
int x=0,f=0;char ch=getchar();
while(ch<'0' || ch>'9') f|=ch=='-',ch=getchar();
while(ch>='0' && ch<='9') x=x*10+ch-'0',ch=getchar();
return f?-x:x;
}
inline void setfile(){
freopen(FNAME".in","r",stdin);
freopen(FNAME".out","w",stdout);
}
int n,a[maxn],pos[maxn];
string ans;
bool vis[maxn];
void ext(string s,string t,int x,int y,int L,int R,int l,int r){
bool flag=true;
while(y>=r){
while(x<l){
if(L>=l && a[L]==a[x]) L--,t.PB('L');
else if(R<=r && a[R]==a[x]) R++,t.PB('R');
else break;
x++;s.PB('L');
}
if(y==r){flag=x>=l;break;}
if(L>=l && a[L]==a[y]) L--,t.PB('L');
else if(R<=r && a[R]==a[y]) R++,t.PB('R');
else{flag=false;break;}
y--;s.PB('R');
}
reverse(t.begin(),t.end());
if(flag) ans=min(ans,s+t);
}
void work(int l,int r){
bool flag=true;
FOR(i,l,r){
if(pos[a[i]]) flag=false;
pos[a[i]]=i;
}
if(flag){
if(l!=1) ext("L","L",2,2*n,pos[a[1]]-1,pos[a[1]]+1,l,r);
if(r!=2*n) ext("R","L",1,2*n-1,pos[a[2*n]]-1,pos[a[2*n]]+1,l,r);
}
FOR(i,l,r) pos[a[i]]=0;
}
void solve(){
n=read();
FOR(i,1,2*n) a[i]=read();
ans=string(2*n,'R');
int j=2*n;
ROF(i,2*n,1){
while(j && !vis[a[j]]) vis[a[j]]=true,j--;
if(i-j==n){
work(j+1,i);
if(i!=2*n){
while(i>j) vis[a[i]]=false,i--;
i++;
}
}
vis[a[i]]=false;
}
work(1,n);
if(ans==string(2*n,'R')) printf("-1");
else FOR(i,0,2*n-1) putchar(ans[i]);
puts("");
}
int main(){
// setfile(); // remember!
int T=read();
while(T--) solve();
}