貌似是最简单的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;
}