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;
}
View Code

猜你喜欢

转载自www.cnblogs.com/Forever-666/p/11261497.html