\(\mathcal{Description}\)

  Link.

  给定长度为 \(n\),包含 A, B, C 三种字符的字符串 \(S\),定义一次操作为将其中相邻两个不相同的字符替换为字符集中不同于这两个字符的另一种字符。求任意次操作后得到的不同字符串个数,答案对 \(10^9+7\) 取模。

  \(n\le10^6\)。

\(\mathcal{Solution}\)

  我们希望探究此种替换操作的结合性,trick 为将字符集替换为数字集,将操作表达为数字间的运算。对于本题,令 A, B, C 为 \(1,2,3\),那么替换操作等价于将相邻两数替换为其异或和,于是就能预处理前缀异或和来求出一段区间操作后的结果。

  接下来就能 DP 啦,令 \(f(i)\) 表示 \(S\) 前 \(i\) 个字符构成串的答案,枚举操作得到的串的下一个字符即可转移。最终答案为所有满足原串中后缀异或和为 \(0\) 的 \(f(i)\) 之和。

\(\mathcal{Code}\)

/* Clearink */

#include <cstdio>

#define rep( i, l, r ) for ( int i = l, rpbound##i = r; i <= rpbound##i; ++i )
#define per( i, r, l ) for ( int i = r, rpbound##i = l; i >= rpbound##i; --i ) const int MAXN = 1e6, MOD = 1e9 + 7;
int n, f[MAXN + 5], sum[MAXN + 5], nxt[MAXN + 5][4];
char s[MAXN + 5]; inline void addeq ( int& a, const int b ) { ( a += b ) >= MOD && ( a -= MOD, 0 ); } int main () {
scanf ( "%d %s", &n, s + 1 );
bool flg = false;
rep ( i, 1, n ) if ( ( flg = s[i] != s[1] ) ) break;
if ( !flg ) return puts ( "1" ), 0;
rep ( i, 1, n ) sum[i] = sum[i - 1] ^ ( s[i] - 'A' + 1 );
rep ( j, 0, 3 ) nxt[n][j] = n + 1;
per ( i, n, 1 ) {
rep ( j, 0, 3 ) nxt[i - 1][j] = nxt[i][j];
nxt[i - 1][sum[i]] = i;
}
f[0] = 1;
int ans = 0;
rep ( i, 0, n - 1 ) {
rep ( j, 0, 3 ) if ( sum[i] ^ j ) {
addeq ( f[nxt[i][j]], f[i] );
}
if ( sum[i + 1] == sum[n] ) addeq ( ans, f[i + 1] );
}
printf ( "%d\n", ans );
return 0;
}

Solution -「ARC 110E」Shorten ABC的更多相关文章

  1. Solution -「ARC 104E」Random LIS

    \(\mathcal{Description}\)   Link.   给定整数序列 \(\{a_n\}\),对于整数序列 \(\{b_n\}\),\(b_i\) 在 \([1,a_i]\) 中等概率 ...

  2. Solution -「ARC 101D」「AT4353」Robots and Exits

    \(\mathcal{Description}\)   Link.   有 \(n\) 个小球,坐标为 \(x_{1..n}\):还有 \(m\) 个洞,坐标为 \(y_{1..m}\),保证上述坐标 ...

  3. Solution -「ARC 110D」Binomial Coefficient is Fun

    \(\mathcal{Description}\)   Link.   给定非负整数序列 \(\{a_n\}\),设 \(\{b_n\}\) 是一个非负整数序列且 \(\sum_{i=1}^nb_i\ ...

  4. Solution -「ARC 124E」Pass to Next

    \(\mathcal{Description}\)   Link.   有 \(n\) 个人站成一个环,初始时第 \(i\) 个人手里有 \(a_i\) 个球.第 \(i\) 个人可以将自己手中任意数 ...

  5. Solution -「ARC 126E」Infinite Operations

    \(\mathcal{Description}\)   Link.   给定序列 \(\{a_n\}\),定义一次操作为: 选择 \(a_i<a_j\),以及一个 \(x\in\mathbb R ...

  6. Solution -「ARC 126F」Affine Sort

    \(\mathcal{Description}\)   Link.   给定 \(\{x_n\}\),令 \[f(k)=\left|\{(a,b,c)\mid a,b\in[0,c),c\in[1,k ...

  7. Solution -「ARC 125F」Tree Degree Subset Sum

    \(\mathcal{Description}\)   Link.   给定含有 \(n\) 个结点的树,求非负整数对 \((x,y)\) 的数量,满足存在 \(\exist S\subseteq V ...

  8. Solution -「ARC 125E」Snack

    \(\mathcal{Description}\)   Link.   把 \(n\) 种零食分给 \(m\) 个人,第 \(i\) 种零食有 \(a_i\) 个:第 \(i\) 个人得到同种零食数量 ...

  9. Solution -「ARC 058C」「AT 1975」Iroha and Haiku

    \(\mathcal{Description}\)   Link.   称一个正整数序列为"俳(pái)句",当且仅当序列中存在连续一段和为 \(x\),紧接着连续一段和为 \(y ...

随机推荐

  1. uniapp 判断 IOS和Android的GPS是否开启并设置启动

    checkOpenGPSServiceByAndroidIOS() { let system = uni.getSystemInfoSync(); // 获取系统信息 console.log(syst ...

  2. php伪协议总结

    本篇总结下一些封装协议,涉及的相关协议:file://.php://filter.php://input.zip://.compress.bzip2://.compress.zlib://.data: ...

  3. mysql按照时间分组查询

    mysql 按年.月.周.日分组查询 1.按照年份分组查询 SELECT DATE_FORMAT(t.bill_time,'%Y') month_time,sum(t.pay_price) total ...

  4. #pragma pack() -----设置默认对齐数

    #pragma pack()  -----设置默认对齐数 预处理命令#pragma:程序如下 则根据修改的对齐数来算:则需要占据内存的大小是14 如果不进行设置,则按照编译器默认的对齐数来算:则需要占 ...

  5. day 8 求平均数

    fun()函数的功能:计算形参x所指数组中N个数的平均值,(这里全部取浮点数) 并输出,在将大于平均值的数放在形参y所指的数组中,在主函数输出. 效果还不错: 还存在需要优化的分析:其实存到y数组中的 ...

  6. Ubuntu 桌面版使用总结

    最近拿出了大学时买的性(游)能(戏)本(机),其实从直观来看,硬件基础还是不错的,但是跑 WIN10, 清了各种广告,关了各种无效进城之后,用起来仍然还是很不爽.可能是已经用惯 mac 了吧,mac给 ...

  7. python实现--九九乘法表

    1 for i in range(1,10): 2 for j in range(1,i+1): 3 print("%d*%d=%d"%(j,i,j*i),end="\t ...

  8. node.js在Linux下执行shell命令、.sh脚本

    首先,引入子进程模块 var process = require('child_process'); 执行shell命令 调用该模块暴露出来的方法exec process.exec('shutdown ...

  9. JavaCV的摄像头实战之二:本地窗口预览

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

  10. centos7无法访问虚拟机web服务

    第一种: 先看下防火墙状态:firewall-cmd --state 关闭防火墙再试试:systemctl stop firewalld.service 第二种,不想关闭防火墙 放开http服务 fi ...