题意:就是给你一些字符串,然后输出本身和本身字符串中最短非公共的前缀。
思路:用字典将之前的字符串插入字典树中,然后查询次数为1的节点。没有就输出整个字符串。
#include<stdio.h>
#include<string.h>
int cur=1;
char s[20011][50];
struct node
{
int next[26];
int idx;
void init()
{
idx=0;
memset(next,-1,sizeof(next));
}
}t[1000111];
void insert(char *s)
{
int len=strlen(s),p=0;
for(int i=0;i<len;i++)
{
int x=s[i]-'a';
if(t[p].next[x]==-1)
{
t[cur].init();
t[p].next[x]=cur++;
}
p=t[p].next[x];
t[p].idx++;
}
}
void query(char *s)
{
int i=0,p=0;
while(s[i])
{
int x=s[i]-'a';
if(t[p].idx==1)
{
printf("%s ",s);
s[i]='\0';
printf("%s\n",s);
return ;
}
p=t[p].next[x];
i++;
}
printf("%s %s\n",s,s);
}
int main()
{
int cnt=0;
t[0].init();
while(scanf("%s",s[cnt++])!=EOF)
{
insert(s[cnt-1]);
}
for(int i=0;i<cnt;i++)
{
query(s[i]);
}
return 0;
}