pat 1077 Kuchiguse(20 分) (字典树)

1077 Kuchiguse(20 分)

The Japanese language is notorious for its sentence ending particles. Personal preference of such particles can be considered as a reflection of the speaker's personality. Such a preference is called "Kuchiguse" and is often exaggerated artistically in Anime and Manga. For example, the artificial sentence ending particle "nyan~" is often used as a stereotype for characters with a cat-like personality:

  • Itai nyan~ (It hurts, nyan~)

  • Ninjin wa iyada nyan~ (I hate carrots, nyan~)

Now given a few lines spoken by the same character, can you find her Kuchiguse?

Input Specification:

Each input file contains one test case. For each case, the first line is an integer N (2N100). Following are N file lines of 0~256 (inclusive) characters in length, each representing a character's spoken line. The spoken lines are case sensitive.

Output Specification:

For each test case, print in one line the kuchiguse of the character, i.e., the longest common suffix of all N lines. If there is no such suffix, writenai.

Sample Input 1:

3
Itai nyan~
Ninjin wa iyadanyan~
uhhh nyan~

Sample Output 1:

nyan~

Sample Input 2:

3
Itai!
Ninjinnwaiyada T_T
T_T

Sample Output 2:

nai
  1 #include <iostream>
  2 #include <algorithm>
  3 #include <cstdio>
  4 #include <cstring>
  5 #include <string>
  6 #include <map>
  7 #include <stack>
  8 #include <vector>
  9 #include <queue>
 10 #include <set>
 11 #define LL long long
 12 #define INF 0x3f3f3f3f
 13 using namespace std;
 14 const int MAX = 1e5 + 10;
 15 
 16 int n, rt = 0, str_len = INF;
 17 struct node
 18 {
 19     int id, cnt, next[128];
 20 } P[MAX];
 21 char shortest_str[300];
 22 stack <char> st;
 23 
 24 void init(int x)
 25 {
 26     for (int i = 0; i <= 127; ++ i)
 27         P[x].next[i] = -1;
 28 }
 29 
 30 void my_insert(char *S, int len, int x)
 31 {
 32     int now = 0;
 33     for (int i = 0; i < len; ++ i)
 34     {
 35         if (P[now].next[S[i]] == -1)
 36         {
 37             P[now].next[S[i]] = ++ rt;
 38             init(rt);
 39         }
 40         now = P[now].next[S[i]];
 41         P[now].cnt ++;
 42     }
 43 }
 44 
 45 int my_find(int len)
 46 {
 47     int now = 0;
 48     for (int i = 0; i < len; ++ i)
 49     {
 50         if (P[now].next[shortest_str[i]] == -1) return -1;
 51         now = P[now].next[shortest_str[i]];
 52     }
 53     return P[now].cnt;
 54 }
 55 
 56 int main()
 57 {
 58 //    freopen("Date1.txt", "r", stdin);
 59     scanf("%d", &n);
 60     init(0);
 61     getchar();
 62     for (int i = 0; i < n; ++ i)
 63     {
 64         char buf[300];
 65         string temp;
 66         getline(cin, temp);
 67         int len = temp.size();
 68         for (int j = 0, k = len - 1; k >= 0; -- k, ++ j)
 69             buf[j] = temp[k];
 70         buf[len] = '\0';
 71         my_insert(buf, len, i);
 72         if (len < str_len)
 73         {
 74             str_len = len;
 75             strcpy(shortest_str, buf);
 76         }
 77     }
 78 
 79     if (P[P[0].next[shortest_str[0]]].cnt != n)
 80     {
 81         printf("nai\n");
 82         return 0;
 83     }
 84     for (int i = str_len; i >= 1; -- i)
 85     {
 86         if (my_find(i) == n)
 87         {
 88             for (int j = 0; j < i; ++ j)
 89                 st.push(shortest_str[j]);
 90             break;
 91         }
 92     }
 93     while (st.size())
 94     {
 95         printf("%c", st.top());
 96         st.pop();
 97     }
 98 
 99     return 0;
100 }

 

posted @ 2018-09-05 14:48  GetcharZp  阅读(176)  评论(0编辑  收藏  举报