亳州市网站建设_网站建设公司_Sketch_seo优化
2026/1/19 19:34:46 网站建设 项目流程

题目链接

寻找不变量,发现若把 \(\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;
}

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询