cf B. Bear and Compressing

B. Bear and Compressing

 思路:字符串是什么样的有多种情况不定,但我们总是知道最后一个肯定是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 }

猜你喜欢

转载自www.cnblogs.com/thief-of-book/p/11873190.html