• 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
  • 相关阅读:
    Study Plan The FortyEighth Day
    原码与补码
    【innoDB】加锁案例分析
    【InnoDB】事务基础知识
    了解 CAP
    妙用位运算
    Go学习笔记
    .NET Hot Reload热重载
    .NET 6 中的 dotnet monitor
    C# 实现多线程的同步方法详解
  • 原文地址:https://www.cnblogs.com/Forever-666/p/11261497.html
Copyright © 2020-2023  润新知