码迷,mamicode.com
首页 > 其他好文 > 详细

codeforces 1178E-Archaeology

时间:2019-07-29 00:41:49      阅读:72      评论:0      收藏:0      [点我收藏+]

标签:abc   根据   mes   传送门   get   color   gif   取出   nbsp   

传送门: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

标签:abc   根据   mes   传送门   get   color   gif   取出   nbsp   

原文地址:https://www.cnblogs.com/Forever-666/p/11261497.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!