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;
}
posted @ 2026-01-19 19:32  yemuzhe  阅读(0)  评论(0)    收藏  举报