codeforces 1178E-Archaeology
传送门:QAQQAQ
题意:给你一个字符串,保证字符串中只包含有$ABC$三种字符,且两相邻字符不相同,求任意一个回文串,使回文串长度大于字符串长度一半(向下取整),不行则输出-1
题意:这道题是不存在不可能的情况的。要注意题目中的条件:“相邻字母不相同,只包含$ABC$,要求只要达到一半”。
——根据这些“奇怪的要求”能想到什么呢?我们可以每次“卡边界”,刚好达到一半,而且只有三种字符,且相邻不相同,我们就会想到抽屉原理,每次前后各取两个,则四个字符中前后必有一对匹配,将它们取出即可达到要求,对于4个4个匹配后剩下的余数,因为向下取整,只需任意取一个就可以啦~
代码:
#include<bits/stdc++.h> using namespace std; const int N=1000050; char s[N]; int n,bl[N],a[N]; int main() { scanf("%s",s+1); n=strlen(s+1); for(int i=1;i<=n;i++) a[i]=s[i]-'a'; int l=1,r=n; while(r-l+1>=4) { if(a[l]==a[r]) bl[l]=1,bl[r]=1; else if(a[l+1]==a[r]) bl[l+1]=1,bl[r]=1; else if(a[l]==a[l+1]) bl[l]=1,bl[l+1]=1; else if(a[l]==a[r-1]) bl[l]=1,bl[r-1]=1; else if(a[l+1]==a[r-1]) bl[l+1]=1,bl[r-1]=1; else bl[r]=1,bl[r-1]=1; l+=2; r-=2; } if(l<r) bl[l]=1; for(int i=1;i<=n;i++) if(bl[i]) printf("%c",s[i]); return 0; }