Solution -「ARC 110E」Shorten ABC
\(\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的更多相关文章
- Solution -「ARC 104E」Random LIS
\(\mathcal{Description}\) Link. 给定整数序列 \(\{a_n\}\),对于整数序列 \(\{b_n\}\),\(b_i\) 在 \([1,a_i]\) 中等概率 ...
- Solution -「ARC 101D」「AT4353」Robots and Exits
\(\mathcal{Description}\) Link. 有 \(n\) 个小球,坐标为 \(x_{1..n}\):还有 \(m\) 个洞,坐标为 \(y_{1..m}\),保证上述坐标 ...
- Solution -「ARC 110D」Binomial Coefficient is Fun
\(\mathcal{Description}\) Link. 给定非负整数序列 \(\{a_n\}\),设 \(\{b_n\}\) 是一个非负整数序列且 \(\sum_{i=1}^nb_i\ ...
- Solution -「ARC 124E」Pass to Next
\(\mathcal{Description}\) Link. 有 \(n\) 个人站成一个环,初始时第 \(i\) 个人手里有 \(a_i\) 个球.第 \(i\) 个人可以将自己手中任意数 ...
- Solution -「ARC 126E」Infinite Operations
\(\mathcal{Description}\) Link. 给定序列 \(\{a_n\}\),定义一次操作为: 选择 \(a_i<a_j\),以及一个 \(x\in\mathbb R ...
- 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 ...
- Solution -「ARC 125F」Tree Degree Subset Sum
\(\mathcal{Description}\) Link. 给定含有 \(n\) 个结点的树,求非负整数对 \((x,y)\) 的数量,满足存在 \(\exist S\subseteq V ...
- Solution -「ARC 125E」Snack
\(\mathcal{Description}\) Link. 把 \(n\) 种零食分给 \(m\) 个人,第 \(i\) 种零食有 \(a_i\) 个:第 \(i\) 个人得到同种零食数量 ...
- Solution -「ARC 058C」「AT 1975」Iroha and Haiku
\(\mathcal{Description}\) Link. 称一个正整数序列为"俳(pái)句",当且仅当序列中存在连续一段和为 \(x\),紧接着连续一段和为 \(y ...
随机推荐
- vim - 显示不可见字符(:set list)
默认情况下,vim是不会显示space,tabs,newlines,trailing space,wrapped lines等不可见字符的.我们可以使用以下命令打开list选项,来显示非可见字符: : ...
- Python常用功能函数系列总结(五)
本节目录 常用函数一:向量距离和相似度计算 常用函数二:pagerank 常用函数三:TF-IDF 常用函数四:关键词提取 常用函数一:向量距离和相似度计算 KL距离.JS距离.余弦距离 # -*- ...
- 记一次 WinDbg 分析 .NET 某工厂MES系统 内存泄漏分析
一:背景 1. 讲故事 上个月有位朋友加微信求助,说他的程序跑着跑着就内存爆掉了,寻求如何解决,截图如下: 从聊天内容看,这位朋友压力还是蛮大的,话说这貌似是我分析的第三个 MES 系统了,看样子 . ...
- Selenium2+python自动化65-js定位几种方法总结
Selenium2+python自动化65-js定位几种方法总结 前言 本篇总结了几种js常用的定位元素方法,并用js点击按钮,对input输入框输入文本 一.以下总结了5种js定位的方法 除了i ...
- 【LeetCode】628. 三个数的最大乘积
解题思路 如果数组中全是正数或者全是负数,最大乘积就是最大的三个数的乘积.如果数组中既有正数又有负数,最大乘积可能是三个最大正数乘积,也可能是两个最小负数和最大正数的乘积.遍历数组找到最大的三个数和最 ...
- linux简单命令汇总
ls [选项] [文件或目录] -a 显示所有文件,包括隐藏文件 -l 显示详细信息 -d 查看目录属性 -h 人性化显示文件大小 -i 显示inode mkdir [选项] 目录名 -p 递归创建 ...
- JavaScript DOM 基础操作
JavaScript DOM 基础操作 一.获取元素的六方式 document.getElementById('id名称') //根据id名称获取 document.getElementsByclas ...
- Java读取批量Excel文件
1.首先基础知识: 原文链接:https://blog.csdn.net/baidu_39298625/article/details/105842725 一 :简介 开发中经常会设计到excel的处 ...
- 新手学习Java,如何快速从入门到精通!
首先我要给你说的是,任何一个东西从零到精通,都是需要一个过程的,就相当于我们在小学的时候学乘法口诀表,背文言文一样,都是需要我们慢慢的去渡过这个阶段,我们才能慢慢的掌握,其次,毕竟这是一门编程语言,你 ...
- 【刷题-LeetCode】153 Find Minimum in Rotated Sorted Array
Find Minimum in Rotated Sorted Array Suppose an array sorted in ascending order is rotated at some p ...