链接:点击打开链接
给你一些字符串,输出字符串本身的唯一前缀。字典树模板题。
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cstdlib>
using namespace std;
#define MAX 26
struct trie{
struct trie *next[MAX];
int num;
};
trie *root;
int n;
void bulidtrie(char *str){
int len=strlen(str);
struct trie *p=root,*q;
for(int i=0;i<len;i++){
int id=str[i]-'a';
if(p->next[id]==NULL){
q=(trie *)malloc(sizeof(trie));
q->num=1;
for(int j=0;j<MAX;j++)
q->next[j]=NULL;
p->next[id]=q;
p=p->next[id];
}
else{
p->next[id]->num++;
p=p->next[id];
}
}
// p->num=-1;
}
void findtrie(char *str){
int len=strlen(str);
trie *p=root;
char a[30];
for(int i=0;i<len;i++){
int id=str[i]-'a';
p=p->next[id];
a[i]=str[i];
a[i+1]='\0';
if(p->num==1){
printf("%s %s\n",str,a);
return;
}
}
printf("%s %s\n",str,str);
}
int main(){
char str[1100][30];
int i,j;
root=(struct trie *)malloc(sizeof(trie));
for( i=0;i<MAX;i++) root->next[i]=0;
root->num=0;
n=0;
while(scanf("%s",str[n])!=EOF){
bulidtrie(str[n]);
n++;
}
for(j=0;j<n;j++)
findtrie(str[j]);
return 0;
}