Shortest Prefixes 字典树
题目大意:
给出一些单词,找出每个单词的最短前缀,这个前缀不能和其他单词的前缀相同,即前缀唯一,否则就输出它本身。
思路:
字典树模板题,记录一下每个串出现的次数,如果是叶节点,即vis【i】==1,就为答案 。
Code:
#pragma GCC optimiza(2)
#include <iostream>
#include <cstdio>
#include<cmath>
#include <cstring>
#include <algorithm>
#include <vector>
#include <set>
#include <map>
#define inf 0x3f3f3f3f
using namespace std;
const int maxn = 100007;
int trie[maxn][27]; //trie[i][j]=k,下标为i,字母为j的节点的j的后边字母的下标
int vis[maxn];
char s[1007][30];
int k=1;
void insert(char *w){
int len=strlen(w);
int p=0;
for(int i=0;i<len;i++){
int c=w[i]-'a';
if(!trie[p][c]){
trie[p][c]=k++;
}
p=trie[p][c];
vis[p]++;
}
}
string search(string s){
string ans;
int len=s.length();
int p=0;
for(int i=0;i<len;i++){
if(vis[p]==1) return ans;
int c=s[i]-'a';
// if(!trie[p][c]) return 0;
ans+=s[i];
p=trie[p][c];
}
// return color[p]==1;
return ans;
}
int main()
{
int n=0;
while(scanf("%s",s[++n])!=EOF){
insert(s[n]);
}
for(int i=1;i<=n;i++){
cout<<s[i]<<" "<<search(s[i])<<endl;
}
return 0;
}