AtCoder ARC #108 : D - AB
问题
在初始状态下,有一个字符串"AB",执行以下过程,直到此字符串的长度为 N。
按此顺序选择字符 x 和 y 的相邻位置,然后插入字符 C[x] [y]。
最终可能的字符串数量是多少?
暴力打表找规律,考虑C[x][y]的不同取值
打表代码
const int maxn = 1e5 + 7;
const int mod = 1e9 + 7;
int n, m, k, t, a[maxn];
string s = "AB";
char c[2][2];
set<string> mp;
void dfs(int n)
{
if (n == 0) {
mp.insert(s);
return;
}
for (int i = 0; i + 1 < s.size(); i++) {
if (s[i] == 'A' && s[i + 1] == 'B') {
s.insert(i + 1, 1, c[0][1]);
dfs(n - 1);
s.erase(i + 1, 1);
} else if (s[i] == 'A' && s[i + 1] == 'A') {
s.insert(i + 1, 1, c[0][0]);
dfs(n - 1);
s.erase(i + 1, 1);
} else if (s[i] == 'B' && s[i + 1] == 'A') {
s.insert(i + 1, 1, c[1][0]);
dfs(n - 1);
s.erase(i + 1, 1);
} else if (s[i] == 'B' && s[i + 1] == 'B') {
s.insert(i + 1, 1, c[1][1]);
dfs(n - 1);
s.erase(i + 1, 1);
}
}
}
int main()
{
for (int caa = 0; caa <= 1; caa++)
for (int cab = 0; cab <= 1; cab++)
for (int cba = 0; cba <= 1; cba++)
for (int cbb = 0; cbb <= 1; cbb++) {
c[0][0] = caa + 'A', c[0][1] = cab + 'A', c[1][0] = cba + 'A', c[1][1] = cbb + 'A';
cout << c[0] << c[1] << endl;
for (int i = 1; i <= 10; i++) {
mp.clear(), s = "AB";
dfs(i);
cout << mp.size() << " ";
}
cout << endl;
}
}
/*
AAAAAA
1 1 1 1 1 1 1 1 1 1
AAABAB
1 1 1 1 1 1 1 1 1 1
AABABA
1 1 1 1 1 1 1 1 1 1
AABBBB
1 1 1 1 1 1 1 1 1 1
ABAAAA
1 2 4 8 16 32 64 128 256 512
ABABAB
1 1 1 1 1 1 1 1 1 1
ABBABA
1 2 3 5 8 13 21 34 55 89
ABBBBB
1 1 1 1 1 1 1 1 1 1
BAAAAA
1 2 3 5 8 13 21 34 55 89
BAABAB
1 2 3 5 8 13 21 34 55 89
BABABA
1 2 4 8 16 32 64 128 256 512
BABBBB
1 2 4 8 16 32 64 128 256 512
BBAAAA
1 2 4 8 16 32 64 128 256 512
BBABAB
1 1 1 1 1 1 1 1 1 1
BBBABA
1 2 3 5 8 13 21 34 55 89
BBBBBB
1 1 1 1 1 1 1 1 1 1
*/
我看见 你

浙公网安备 33010602011771号