为给出的每一个单词寻找一个可以代表它的前缀。可以使用字典树,统计结点被遍历的次数,如果只被遍历过1次那么证明是可用的前缀。
AC代码:
#include <math.h>
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
using namespace std;
const int MAX = 1010*25;
int cnt;
char s[1010][25];
struct Trie{
int flag;
int next[26];
}node[MAX];
void Init(){
cnt = 1;
for(int i=0; i<MAX; i++){
node[i].flag = 0;
memset(node[i].next, -1, sizeof(node[i].next));
}
};
void Insert(int x){
int p = 0, n = strlen(s[x]);
for(int i=0; i<n; i++){
if(node[p].next[s[x][i] - 'a'] == -1){
node[p].next[s[x][i] - 'a'] = cnt++;
}
p = node[p].next[s[x][i] - 'a'];
node[p].flag++;
}
}
void Search(int x){
int p = 0, n = strlen(s[x]);
for(int i=0; i<n; i++){
p = node[p].next[s[x][i] - 'a'];
printf("%c",s[x][i]);
if(node[p].flag == 1) break;
}
}
int main(){
int num = 0;
Init();
while(cin >> s[num]){
Insert(num);
num++;
}
for(int i=0; i<num; i++){
printf("%s ",s[i]);
Search(i);
puts("");
}
return 0;
}