题意
一个长度为n的AB串。
每个位置实际是一个机器,机器有两种状态A和B。
每当一个球从左右某一端进入一个机器时,如果是A状态,就从同一端扔出去,否则从另一端扔出去。每次这样后机器会更改状态。
从最左端的机器左端扔一个球,最后一定会从最左或最右弹出。
问从最左端依次扔k个球,最后AB串长啥样。
n<=200000,k<=10^9
分析
手玩一下发现有循环节,那么只要把前面一部分求出来,然后分奇偶性讨论一下即可。
代码
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=200005;
int n,m,a[N*3];
char s[N];
int main()
{
scanf("%d%d",&n,&m);
scanf("%s",s+1);
for (int i=1;i<=n;i++) a[i]=s[i]-'A';
int tag=0,now=1;
for (int i=1;m&&i<=n*2;i++,m--)
{
if ((a[now]^tag)==0) a[now]^=1;
else tag^=1,a[now+n]=tag,now++;
}
if (n&1)
{
if (m&&(a[now]^tag)==1) tag^=1,a[now+n]=tag,now++,m--;
m%=2;
if (m)
{
if (a[now]^tag==0) a[now]^=1;
else tag^=1,a[now+n]=tag,now++;
}
}
for (int i=0;i<n;i++) putchar('A'+(a[now+i]^tag));
return 0;
}