CF1178E Archaeology
codeforces
考虑只有三个字符,所以每四个必然选出两个来,也就是不存在\(\rm impossible\)的情况
所以我们简单模拟就好了,从两端往中间扫,不匹配就移动一端,时间复杂度\(O(n)\)。
代码:
#include<cstdio>
#include<algorithm>
#include<iostream>
#include<cstring>
using namespace std;
#define rg register
void read(int &x){
char ch;bool ok;
for(ok=0,ch=getchar();!isdigit(ch);ch=getchar())if(ch=='-')ok=1;
for(x=0;isdigit(ch);x=x*10+ch-'0',ch=getchar());if(ok)x=-x;
}
const int maxn=1e6+10;
char a[maxn],ans[maxn];int n,m,mx,sum;
int pos[maxn],tot,w[3],s[3];
int main(){
scanf("%s",a+1),n=strlen(a+1);m=n/2;
if(n==2)return printf("%c",a[1]),0;
int l=1,r=n;
while(l<r){
if(a[l]==a[r])ans[++sum]=a[l],pos[sum]=l,l++,r--;
else {
if(a[l+1]==a[r]&&l+1<r)ans[++sum]=a[l+1],pos[sum]=l+1,l+=2,r--;
else if(a[l]==a[r-1]&&l<r-1)ans[++sum]=a[l],pos[sum]=l,l++,r-=2;
else l++,r--;
}
}
l=pos[sum]+1;
for(rg int i=1;i<=sum;i++)printf("%c",ans[i]);
if(a[l]!=ans[sum])printf("%c",a[l]);
for(rg int i=sum;i;i--)printf("%c",ans[i]);
}