字符串
题目描述
小 D 现在正在研究一种特殊的字符串:仅由 A,B,C,D 四种字母组成的字符串。
对于这样的一个字符串 S,小 D 可以用以下两种方式之一修改这个字符串:
- 交换 S 中的相邻两个字母;
- 使用一种魔法。小 D 共有 m 种魔法,其中第 i 种可以将 S 中一个等于 Xi 的子串(如果你不知道他是什么,可以参考 “数据规模与约定” 一节)替换为 Yi。保证 ∣Xi∣=∣Yi∣。
小 D 觉得通过修改得到不同的字符串非常有意思,于是他想要知道:对于所有这样的(即仅由 A,B,C,D 四种字母组成的字符串)长度为 n 的字符串 S,经过的字符串最多的修改序列是哪个(注意:如果一个字符串被经过了多次,他也只能被计算一次)?
你并不愿意帮助他,但是盛情难却,所以你只要帮他求出最多的那个修改序列经过了多少字符串即可。
输入格式
第一行两个空格隔开的整数 n,m,表示字符串的长度和魔法的个数。
接下来 m 行,每行两个空格隔开的字符串 Xi,Yi 表示一种魔法。保证 Xi,Yi 仅由 A,B,C,D 四种字母组成。
输出格式
输出一行一个整数表示答案。
样例输入 1
2 3 A B A C D D
样例输出 1
5
样例解释 1
其中一种最优方案为 AA→AB→BA→BC→CB,这样共经过了 5 个字符串。可以证明这是最优答案。
样例输入 2
6 6 AABBC AACCB AAAADA DAAABC AAACA AAAAD CABAA ABCBA AAAAAA AABAAA BAAAA AACAA
样例输出 2
499
样例输入输出 3 & 4
见 ex_string3.in/out
以及 ex_string4.in/out
。
数据规模与约定
本题共 20 个测试点,每个测试点 5 分。
对于所有测试数据,保证 1≤n≤50,1≤m≤100,1≤∣Xi∣=∣Yi∣≤n。注意可能有的魔法出现多次,也可能有的魔法中 Xi=Yi。以下为每个测试数据的数据规模:
测试数据编号 | n≤ | m≤ | 测试数据编号 | n≤ | m≤ | |
---|---|---|---|---|---|---|
1 | 3 | 3 | 11 | 20 | 30 | |
2 | 3 | 5 | 12 | 30 | 30 | |
3 | 5 | 5 | 13 | 30 | 40 | |
4 | 5 | 7 | 14 | 30 | 45 | |
5 | 7 | 7 | 15 | 30 | 50 | |
6 | 7 | 10 | 16 | 30 | 65 | |
7 | 10 | 10 | 17 | 50 | 80 | |
8 | 10 | 20 | 18 | 50 | 90 | |
9 | 10 | 25 | 19 | 50 | 95 | |
10 | 10 | 30 | 20 | 50 | 100 |
友情提醒:本题答案可能很大,甚至有可能超过 64 位整数的表示范围(即 C/C++
的 unsigned long long
以及 Pascal
的 qword
)。同时,NOI
系列赛事均禁止使用非标准的 __int128
(对于 C/C++
语言),请选手注意。
子串的定义:对于字符串 S=S1S2S3⋯Sn−1Sn,T 是 S 的子串,当且仅当存在 1≤l≤r≤n,满足 T=SlSl+1Sl+2⋯Sr−1Sr。
时间限制:2s
空间限制:512MB