poj 2001 Shortest Prefixes (trie树)
题意:给出n个字符串的表,问每个字符串的简化表示。简化表示的要求是,以该字符串的最短的而且不能产生歧义的前缀来表示。
思路:字典树,多一个cnt属性,每次insert的时候,路过的每个节点的cnt++
find的时候从root往下扫。。遇到的cnt为1的节点结尾的字符串。。就是该单词的唯一表示。。。
按照这个思路写了一发。。。1A好开心哈哈哈
1/* ***********************************************
2Author :111qqz
3Created Time :2016年08月16日 星期二 02时55分22秒
4File Name :code/poj/2001.cpp
5************************************************ */
6#include <cstdio>
7#include <cstring>
8#include <iostream>
9#include <algorithm>
10#include <vector>
11#include <queue>
12#include <stack>
13#include <set>
14#include <map>
15#include <string>
16#include <cmath>
17#include <cstdlib>
18#include <deque>
19#include <ctime>
20#define fst first
21#define sec second
22#define lson l,m,rt<<1
23#define rson m+1,r,rt<<1|1
24#define ms(a,x) memset(a,x,sizeof(a))
25typedef long long LL;
26#define pi pair < int ,int >
27#define MP make_pair
28using namespace std;
29const double eps = 1E-8;
30const int dx4[4]={1,0,0,-1};
31const int dy4[4]={0,-1,1,0};
32const int inf = 0x3f3f3f3f;
33const int N=1E3+7;
34char s[N][25];
35int n;
36struct Trie
37{
38 struct Node
39 {
40 Node *nxt[26];
41 int cnt;
42 Node()
43 {
44 for ( int i = 0 ; i < 26; i++) nxt[i] = NULL;
45 cnt = 0 ;
46 }
47 };
48 Node *root;
49 void init()
50 {
51 root = new Node();
52 }
53 Trie()
54 {
55 root = new Node();
56 }
57 void Insert(char *s)
58 {
59 Node *u = root;
60 int len = strlen(s);
61 for ( int i = 0 ; i < len ; i++)
62 {
63 int v = s[i]-'a';
64 if (u->nxt[v]==NULL) u->nxt[v] = new Node();
65 u = u->nxt[v];
66 u->cnt++;
67 }
68 }
69 string Find(char *s)
70 {
71 Node *u = root;
72 string res="";
73 int len = strlen(s);
74 for ( int i = 0 ; i < len ; i++)
75 {
76 int v = s[i]-'a';
77 res = res + s[i];
78 u = u->nxt[v];
79 if (u->cnt==1) return res; //cnt为1表示应该就唯一了吧。。。
80 }
81 }
82}trie;
83int main()
84{
85 #ifndef ONLINE_JUDGE
86 freopen("code/in.txt","r",stdin);
87 #endif
88 n = 0 ;
89 trie.init();
90 while (~scanf("%s",s[n++]));
91 n--;
92 for ( int i = 0 ; i <n ; i++)
93 {
94 //cout<<"i:"<<i<<" s[i]:"<<s[i]<<endl;
95 trie.Insert(s[i]);
96 }
97 for ( int i = 0 ; i < n ; i++)
98 {
99 string ans = trie.Find(s[i]);
100 cout<<s[i]<<" "<<ans<<endl;
101 }
102 #ifndef ONLINE_JUDGE
103 fclose(stdin);
104 #endif
105 return 0;
106}