分析:
手推几次之后,发现有个特征:
如果开头是AAA,那么直接退回,如果不是,那么所有字符全部取反,并向前位移1格。
这样一来,很容易发现,末尾会不停地积累BABABA……BABABABABA……BABABABABA……BABA这样的字符串。在不超过2n步后,整个串就变为了BABABA……BABABABABABA……BABABABABABA……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);
}