恶心了。。完全的
#include<iostream>
#include<cstdio>
#include<string.h>
#include<string>
#define MAX 100000
#define NUM_CHAR 26
using namespace std;
struct node{
int rate;
int next[NUM_CHAR];
int init(){
rate=1;
memset(next,-1,sizeof(next));
return 0;
}
}trie[MAX];
int size = 1;
const int root=0;
int val(char a){
return a-'a';
}
void insert(string s){
int p=root;
for(int i=0;i<s.length();i++){
int v=val(s[i]);
if(trie[p].next[v]==-1){
trie[p].next[v]=size;
trie[size].init();
++size;
}
else{
trie[trie[p].next[v]].rate++;
}
p=trie[p].next[v];
}
}
void match(string s){
int p=root;
for(int i=0;i<s.length();i++){
int v=val(s[i]);
cout<<s[i];
if(trie[trie[p].next[v]].rate==1)
return;
p=trie[p].next[v];
}
}
void init(){
size=1;
trie[root].init();
return;
}
void dfs(int x){
for(int i=0;i<26;i++)
if(trie[x].next[i]!=-1){
printf("%d -> %d : %c rate= %d\n",x,trie[x].next[i],i+'a',trie[trie[x].next[i]].rate);
dfs(trie[x].next[i]);
}
}
string s[2000];
int sum=0;
int main(){
init();
while(cin>>s[sum]){
insert(s[sum++]);
}
//dfs(root);
for(int i=0;i<sum;i++){
cout<<s[i]<<" ";
match(s[i]);
cout<<endl;
}
return 0;
}