【思维】【杂题】AGC011D Half Reflector

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_34454069/article/details/82861668

分析:

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

所以,只需要手动模拟前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);
}

猜你喜欢

转载自blog.csdn.net/qq_34454069/article/details/82861668