这道题竟然是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; }