很裸的Trie!注意数组开大点就好了
#include<iostream>
#include<string>
using namespace std;
#define MAX 27
char str[10001][25];
typedef struct Trie //字典树
{
Trie *next[MAX]; //这个看最多有几个字符,
int v; //作为前缀的次数
};
Trie *root;
void insertTrie(char *str) //构建字典树
{
int len=strlen(str);
Trie *p=root,*q;
for(int i=0;i<len;i++)
{
int id=str[i]-'a';
if(p->next[id]==NULL)
{
q=new Trie; //新节点q的创立
q->v=1;
for(int j=0;j<MAX;++j)
q->next[j]=NULL;
p->next[id]=q;
p=p->next[id];
}
else
{
p->next[id]->v++;
p=p->next[id];
}
}
}
int findTrie(char *str)
{
int len=strlen(str),ans;
Trie *p=root;
for(int i=0;i<len;i++)
{
int id=str[i]-'a';
p=p->next[id];
if(p->v==1) //如果发现这个前缀只出现过一次,就返回这个点
{return i;}
}
return len-1; //如果遍历完了都没发现只出现过一次的前缀,返回最后一个点
}
int main()
{
int t,i,j;
t=0;
root=new Trie; //构建根节点!这个很重要,不然会报错
for(i=0;i<MAX;i++)
root->next[i]=NULL;
while(scanf("%s",str[t])!=EOF)
{
insertTrie(str[t]);
t++;
}
for(i=0;i<t;i++)
{
printf("%s ",str[i]);
str[i][ findTrie(str[i]) +1]='\0';
cout<<str[i]<<endl;
}
}