\(\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. debian8.4系统安装后的一些设置

    1.添加软件源  su到root用户vi  /etc/apt/sources.list      也可用gedit  /etc/apt/sources.list   (gnome下用,如果kde下则用 ...

  2. FastDFS文件的上传和下载

    一.FastDFS概述: FastDFS是一个开源的轻量级分布式文件系统,他对文件进行管理,功能包括:文件存储.文件同步.文件访问(文件上传.下载)等,解决了大容量存储和负载均衡的问题,高度追求高性能 ...

  3. 【C】C语言大作业——学生学籍管理系统

    文章目录 学生管理系统 界面 主界面 登陆界面 注册界面 管理界面 学生界面 退出界面 链接 注意 学生管理系统 学C语言时写的一个大作业,弄了一个带图形界面的,使用的是VS配合EasyX图形库进行实 ...

  4. ecos matlab版本安装

    官网链接 github地址 1.注意不仅要下载matlab版本,同时还要下载c版本,因为matlab版本缺少第三方软件,将两个版本解压缩后将c版本下的文件夹external,ecos_bb,inclu ...

  5. BarTender调用示例

    安装BarTender 软件后,会注册一个COM 然后在项目中添加BarTender COM 引用 BarTender模板中的条码右键属性-数据源类型-嵌入的数据-名称(比如设置为 barcode p ...

  6. [STM32F4xx 学习] SPI小结

    一.STM32F4xx系列的SPI特点: 1. 支持全双工的3线SPI模式(即SCK, MISO, MOSI) 2. 支持单工2线传输,同时数据线可以设置成单向或者双向模式 3. 8-bit, 16- ...

  7. 记录python2.7迁移到python3.6过程中的一些代码差异

    python2.7 python 3.6 import urllib2 import urllib import urlparse import urllib import exceptions 废弃 ...

  8. javaweb登陆界面实现不同角色进入不同界面

    目录结构 类包: AccountBean.java AccountDao.java JudgeServlet.java 登陆界面: index.jsp 代码实现 AccountBean.java pa ...

  9. Python 修改AD密码

    前提条件: AD 已开启证书服务(最重要的一句话). import ldap3 SERVER = 'adserver' BASEDN = "DC=example,DC=com" U ...

  10. SNAT技术

    前面在讲解 firewall-config 工具的功能时,曾经提到了 SNAT(Source Network Address Translation,源网络地址转换)技术.SNAT 是一种为了解决 I ...