zoukankan      html  css  js  c++  java
  • CF 1178E Archaeology 题解

    题面

    这道题竟然是E?还是洛谷中的黑题?

    wow~!!

    于是就做了一下;

    然后一下就A了;(这并不代表想的容易,而是写的容易)

    这道题就是骗人的!!

    什么manacher,什么回文自动机,去靠一边站着,看我的无敌大模拟!

    可以设定l,r两个点,初始时分别指向1和n;

    如果是s[l]==s[r],那么答案就更新(ans+=2,但当l==r时,ans仅加1就够了);

    如果不等,那么就回文自动......诶?等等,题目说只有a,b,c?而且相邻的两位不等?蛤?这是什么情况?

    如果s[i]!=s[j],因为s[j-1]!=s[j],s[i+1]!=s[i],所以至少就是以下几种情况中的一种,s[i+1]==s[j],s[i]==s[j-1],s[i+1]==s[j-1];

    然后对其模拟,然后就轻松愉快的A啦~

    #include <bits/stdc++.h>
    using namespace std;
    int n;
    char s[1000010];
    bool bo[1000010];
    int cnt;
    int main() {
        scanf("%s", s + 1);
        int l=0,r=0;
        n=r=strlen(s + 1);
        while(l <= r){
            if(s[l] == s[r]){ 
                bo[l] = bo[r] = 1;
                cnt+=2;
                if(l==r){
                    --cnt;
                }
                ++l;
                --r;
            }
            else if(l+1<=r&&s[l+1]==s[r]){
                bo[l+1]=bo[r]=1;
                cnt+=1+(l+1!=r);
                l+=2, --r;
            }
            else if (l<=r-1&&s[l]==s[r-1]){
                bo[l]=bo[r-1]=1;
                cnt+=1+(l!=r-1);
                ++l, r-=2;
            } 
            else{
                ++l, --r;
            }
        }
        if(cnt>=n/2){
            for(int i=1;i<=n;i++){
                if(bo[i]){
                    printf("%c",s[i]);
                }
            }
            puts("");
        } 
        else{
            puts("IMPOSSIBLE");
        }
        return 0;
    }
  • 相关阅读:
    H3C交换机流量镜像
    脚本引发的思考
    【PAT Advanced Level】1015. Reversible Primes (20)
    JSTL自定义函数完成ACL即时认证
    [翻译Joel On Software]选择一门语言/Choosing a language
    MFC-CWinApp
    poj2462
    HDU 3472 混合图欧拉回路 + 网络流
    Vim命令合集
    Windows下SQLMAP的安装图解
  • 原文地址:https://www.cnblogs.com/kamimxr/p/11295288.html
Copyright © 2011-2022 走看看