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;
}
原文地址:https://www.cnblogs.com/kamimxr/p/11295288.html