AT arc110E - Shorten ABC
寻找不变量,发现若把 \(\texttt A\) 视为 \(1\),\(\texttt B\) 视为 \(2\),\(\texttt C\) 视为 \(3\),则异或和是不变量,然后对前缀异或和数组操作就好了。
后面的操作和 agc027E 差不多,推荐点击链接看那篇题解就好。
#include<cstdio>
#include<algorithm>
#define N 1000005
using namespace std;
const int mod=1e9+7;
int n,a[N],f[N],las[4],las2[4][4];
char s[N];
int main() {
scanf("%d%s",&n,s+1);
for(int i=1;i<=n;i++) a[i]=a[i-1]^(s[i]=='A'?1:s[i]=='B'?2:3);
for(int i=1;i<=n;i++) {
f[i]=((a[i]!=0)+f[i-1])%mod;
for(int j=0;j<4;j++) if(j!=a[i]&&j!=a[i-1]){
int p=0;
for(int k=0;k<4;k++) if(k!=a[i]&&k!=j) p=max(p,las2[j][k]);
f[i]=(f[i]+f[p])%mod;
}
las[a[i]]=i;
for(int j=0;j<4;j++) if(j!=a[i]) las2[j][a[i]]=las[j];
}
printf("%d\n",((las[1]>0)+(las[2]>0)+(las[3]>0))>=2?f[n]:1);
return 0;
}

浙公网安备 33010602011771号