码迷,mamicode.com
首页 > 其他好文 > 详细

cf B. Bear and Compressing

时间:2019-11-17 13:13:25      阅读:68      评论:0      收藏:0      [点我收藏+]

标签:转换   blank   char   tps   int   color   次数   names   ref   

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 }

 

cf B. Bear and Compressing

标签:转换   blank   char   tps   int   color   次数   names   ref   

原文地址:https://www.cnblogs.com/thief-of-book/p/11873190.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!