标签:转换 blank char tps int color 次数 names ref
思路:字符串是什么样的有多种情况不定,但我们总是知道最后一个肯定是a,那么我们就可以反着推,看a是由那个序列变过来的,拿案例一的数据说,比如我们先看见ca,可以变成a,那a的上一个状态就是ca,由“ca”代替“a“,此时长度为2,还不够长,所以继续找,看“ca”中的“c”是哪个序列变过来的呢,这次我们找到了"cc“还有”ee“,同样代替,那“ca”的上一次状态就是“cca”或者“eea”此时找到,长度为n则答案加1,那这么一直寻找的过程就想到了DFS
1 #include <bits/stdc++.h> 2 using namespace std; 3 char s[40][7]; 4 int ans = 0; 5 int n, q; 6 map<char, int>num; 7 void dfs(char ch, int len) 8 { 9 if (len == n) 10 { 11 ans ++; 12 return ; 13 } 14 for (int i = 0; i < q; i++) 15 { 16 if (ch == s[i][3]) 17 { 18 dfs(s[i][1], len + 1); 19 } 20 } 21 } 22 int main() 23 { 24 scanf("%d%d", &n, &q); 25 for (int i = 0; i < q; i++) 26 { 27 scanf("%s %s", s[i] + 1,s[i]+3); 28 num[s[i][3]]++; 29 } 30 dfs(‘a‘, 1); 31 cout << ans << endl; 32 return 0; 33 }
这个跟上面不同的就是减少了寻找次数,当你长度为n-1时,你只要看能转换成 这个状态,直接把那个个数加上答案里。
1 #include <bits/stdc++.h> 2 using namespace std; 3 char s[40][7]; 4 int ans = 0; 5 int n, q; 6 map<char, int>num; 7 int dfs(char ch, int len) 8 { 9 if (len == n - 1) 10 { 11 ans += num[ch]; 12 return 0; 13 } 14 for (int i = 0; i < q; i++) 15 { 16 if (ch == s[i][3]) 17 { 18 dfs(s[i][1], len + 1); 19 } 20 } 21 } 22 int main() 23 { 24 scanf("%d%d", &n, &q); 25 for (int i = 0; i < q; i++) 26 { 27 scanf("%s %s", s[i] + 1,s[i]+3); 28 num[s[i][3]]++; 29 } 30 dfs(‘a‘, 1); 31 cout<<ans<<endl; 32 return 0; 33 }
标签:转换 blank char tps int color 次数 names ref
原文地址:https://www.cnblogs.com/thief-of-book/p/11873190.html