POJ - 2001 Shortest Prefixes
思路
在字典树标记字母出现的次数即可
当发现cnt[p] == 1时,说明这个字母前缀只出现过一次,直接返回即可
代码
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int N = 1010 * 26;
int son[N][26];
int idx;
char str[N][26];
int cnt[N];
void insert(char str[]) {
int p = 0;
for (int i = 0; str[i] != '\0'; i ++) {
int u = str[i] - 'a';
if(!son[p][u])
son[p][u] = ++idx;
p = son[p][u];
cnt[p]++;
}
}
string query(char str[]) {
int p = 0;
string s = "";
for (int i = 0; str[i] != '\0'; i ++) {
int u = str[i] - 'a';
p = son[p][u];
if(cnt[p] == 1){
s += str[i];
return s;
}
else {
s += str[i];
}
}
return s;
}
int main() {
int n = 0;
while(cin >> str[n]) {
insert(str[n]);
n++;
}
for (int i = 0; i < n; i ++) {
cout << str[i] << ' ' << query(str[i]) << endl;
}
return 0;
}