题目链接:点击打开链接
题目大意很简单,就是给出一组字符串,给出能唯一确定每个字符串的前缀。首先进行插入操作建树,然后对每个字符串,再去查询,查询的过程中,遇到出现一次的前缀即为所求
// POJ 2001 Shortest Prefixes.cpp
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <vector>
using namespace std;
struct node {
int times;
node *next[26];
}root;
void insert(char s[]) {
node *p = &root,*q;
for (int i = 0; s[i]; i++) {
q = p->next[s[i] - 'a'];
if (q == NULL) {
q = (node *)malloc(sizeof(node));
q->times = 0;
for (int j = 0; j < 26; j++) {
q->next[j] = NULL;
}
p->next[s[i] - 'a'] = q;
}
p->times++;
p = p->next[s[i] - 'a'];
}
p->times++;
return;
}
void find(char s[]) {
node *p = &root;
char t[25];
strcpy(t, s);
for (int i = 0; s[i]; i++) {
if (p->next[s[i] - 'a']->times == 1) {
t[i + 1] = '\0';
printf("%s\n", t);
return;
}
p = p->next[s[i] - 'a'];
}
printf("%s\n", t);
return;
}
int main() {
char s[25];
vector<string> v;
while (scanf("%s", s) != EOF) {
v.push_back(string(s));
insert(s);
}
for (int i = 0; i < v.size(); i++) {
strcpy(s,v[i].c_str());
printf("%s ", s);
find(s);
}
return 0;
}