codeforces 1178E-Archaeology

Posted forever-666

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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

 

以上是关于codeforces 1178E-Archaeology的主要内容,如果未能解决你的问题,请参考以下文章

JDOJ1178:铺地板II

1178 H. Stock Exchange

bzoj1178 Apio2009—CONVENTION会议中心

思维——cf1178E

BZOJ1178 [Apio2009]CONVENTION会议中心 贪心 set

CF1178H Stock Exchange