当前位置: 代码迷 >> 综合 >> 【思维】【杂题】AGC011D Half Reflector
  详细解决方案

【思维】【杂题】AGC011D Half Reflector

热度:40   发布时间:2023-09-27 05:47:08.0

分析:

手推几次之后,发现有个特征:
如果开头是AAA,那么直接退回,如果不是,那么所有字符全部取反,并向前位移1格。
这样一来,很容易发现,末尾会不停地积累BABABA……BABABABABA……BABABABABABABA这样的字符串。在不超过2n步后,整个串就变为了BABABA……BABABABABABA……BABABABABABABABABA。此时,若长度为奇数,每次操作后会改变第一个字符。若长度为偶数,就不会改变。

所以,只需要手动模拟前2n次操作,代码略丑。

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define SF scanf
#define PF printf
#define MAXN 200010
using namespace std;
int n,k,las,tims;
char s[MAXN],p[MAXN];
int main(){
    SF("%d%d",&n,&k);	SF("%s",s+1);for(int i=1;i<=n;i++)s[i]='B'-s[i];las=n;for(int i=1;i<=min(2*n,k);i++){
    if((s[tims+1]^(tims%2))==1){
    s[tims+1]^=1;continue;}else{
    if(las-tims==0&&n%2==1){
    s[tims+1]^=1;continue;	}}int add=(las-tims>=1);tims+=add;while(las-tims>=n%2+1&&(s[las]^(tims%2))==(n+tims-las+1)%2)las--;//PF("[%d]",las);}//PF("[%d %d]",las,tims);for(int i=1;i<=max(1,las-tims);i++)p[i]='B'-(s[i+tims]^(tims%2));for(int i=max(2,las-tims+1);i<=n;i++)p[i]='B'-(n-i+1)%2;if(k>=2*n){
    int t=(k-2*n)%2;if(n%2==1&&t==1)	p[1]='A'+'B'-p[1];for(int i=2;i<=n;i++)p[i]='B'-(n-i+1)%2;}PF("%s",p+1);
}