poj 2001
貌似是最简单的trie树。。有点会了~
//============================================================================ // Name : 2001.cpp // Author : // Version : // Copyright : Your copyright notice // Description : Hello World in C++, Ansi-style //============================================================================ #include <iostream> #include <cstdio> #include <cstring> using namespace std; char in[10000][50], out[10000][50]; int n; typedef struct node{ int num; node * next[30]; node(){ num = 1; for(int i = 0;i < 30;i++){ next[i] = NULL; } } }node; node *root; void insert(char *str){ int len = strlen(str); node *now = root; int t; if(now == NULL){ now = new node(); now->num = 0; root = now; } for(int i = 0;i < len;i++){ t = str[i]-'a'; if(now->next[t] == NULL){ now->next[t] = new node(); } else{ now->next[t]->num++; } now = now->next[t]; } } void query(char *str, int m){ node *now = root; int len = strlen(str); int t; for(int i = 0;i < len;i++){ t = str[i]-'a'; now = now->next[t]; out[m][i] = str[i]; if(now->num == 1){ out[m][++i] = '\0'; return ; } } } int main(){ freopen("a.txt", "r", stdin); n = 0; while(scanf("%s", in[n])!=EOF){ insert(in[n]); n++; } for(int i = 0;i < n;i++){ query(in[i], i); printf("%s %s\n", in[i], out[i]); } return 0; }