zoukankan      html  css  js  c++  java
  • IndiaHacks 2016


    • B. Bear and Compressing

     
      

       Limak is a little polar bear. Polar bears hate long strings and thus they like to compress them. You should also know that Limak is so young that he knows only first six letters of the English alphabet: 'a', 'b', 'c', 'd', 'e' and 'f'.

       You are given a set of q possible operations. Limak can perform them in any order, any operation may be applied any number of times. The i-th operation is described by a string ai of length two and a string bi of length one. No two of q possible operations have the same string ai.

       When Limak has a string s he can perform the i-th operation on s if the first two letters of s match a two-letter string ai. Performing the i-th operation removes first two letters of s and inserts there a string bi. See the notes section for further clarification.

       You may note that performing an operation decreases the length of a string s exactly by 1. Also, for some sets of operations there may be a string that cannot be compressed any further, because the first two letters don't match any ai.

        Limak wants to start with a string of length n and perform n - 1 operations to finally get a one-letter string "a". In how many ways can he choose the starting string to be able to get "a"? Remember that Limak can use only letters he knows.

     Input

     The first line contains two integers n and q (2 ≤ n ≤ 6, 1 ≤ q ≤ 36) — the length of the initial string and the number of available operations.

     The next q lines describe the possible operations. The i-th of them contains two strings ai and bi (|ai| = 2, |bi| = 1). It's guaranteed that ai ≠ aj for i ≠ j and that all ai and bi consist of only first six lowercase English letters.

    Output

    Print the number of strings of length n that Limak will be able to transform to string "a" by applying only operations given in the input.

    Examples
    Input
    3 5
    ab a
    cc c
    ca a
    ee c
    ff d
    Output
    4
    Input
    2 8
    af e
    dc d
    cc f
    bc b
    da b
    eb a
    bb b
    ff c
    Output
    1
    Input
    6 2
    bb a
    ba a
    Output
    0
    Note

    In the first sample, we count initial strings of length 3 from which Limak can get a required string "a". There are 4 such strings: "abb", "cab", "cca", "eea". The first one Limak can compress using operation 1 two times (changing "ab" to a single "a"). The first operation would change "abb" to "ab" and the second operation would change "ab" to "a".

    Other three strings may be compressed as follows:

    • "cab" "ab" "a"
    • "cca" "ca" "a"
    • "eea" "ca" "a"

    In the second sample, the only correct initial string is "eb" because it can be immediately compressed to "a".

     这是我的第一篇博客。 感觉这道题bfs运用的非常巧妙。

    从a出发,先把2个字符替换一个字符a的字符串中的第一个字符加入队列,以此字符为基点,进行搜索。

     1 #include<iostream>
     2 #include<algorithm>
     3 #include<queue>
     4 #include<cstdio>
     5 using namespace std;
     6 int a[10][10];
     7 struct node{
     8     int x,k;
     9 };
    10 node nod;
    11 queue<node> q;
    12 void input(){
    13     int n,b;
    14     char s1[4],s2[4];
    15     int d,c;
    16     scanf("%d%d",&n,&b);
    17     for(int i = 1; i<=b; i++)
    18     {
    19         scanf("%s%s",s1,s2);
    20         d = s2[0] - 'a' + 1;
    21         c = s1[0] - 'a' + 1;
    22         a[d][c] += 1; 
    23     }
    24     int ans = 0;
    25     for(int j = 1; j<=6; j++){
    26         if(a[1][j]){
    27               for(int i = 1; i<=a[1][j]; i++){
    28                nod.x = j;
    29             nod.k = 2;
    30             q.push(nod);
    31               }
    32 
    33         }
    34     }
    35     while(!q.empty()){
    36         nod = q.front();
    37         q.pop();
    38         if(nod.k == n) ans++;
    39         if(nod.k>n) break;
    40         int x = nod.x;
    41         int k = nod.k;
    42         for(int j = 1; j<=6; j++){
    43             if(a[x][j]){
    44                     for(int i = 1; i<=a[x][j]; i++){
    45                         nod.x = j;
    46                         nod.k = k+1;
    47                         q.push(nod);
    48                     }
    49 
    50             }
    51         }
    52     }
    53     printf("%d
    ",ans);
    54 }
    55 int main()
    56 {
    57     input();
    58     return 0;
    59 }
  • 相关阅读:
    前端面试题
    【429】关于ADT的访问权限
    【428】Dijkstra 算法
    【427】Graph 实现 以及 DFS & BFS
    【426】C 传递数组给函数
    【425】堆排序方法(二叉堆)优先队列(PQ)
    Hadoop案例(九)流量汇总案例
    Hadoop案例(八)辅助排序和二次排序案例(GroupingComparator)
    Hadoop案例(七)MapReduce中多表合并
    Hadoop案例(六)小文件处理(自定义InputFormat)
  • 原文地址:https://www.cnblogs.com/littlepear/p/5327111.html
Copyright © 2011-2022 走看看