这题存下来离线处理,刚开始只想了在线。。。
现将所有的单词存到一个字典树当中,并记录一个节点有多少单词前缀包含了这个前缀,查询时,若走到一个val==1,及只有它有这个前缀的情况,那么就输出,这便是答案
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<cstdlib>
using namespace std;
int n,ch[100005][30],val[100005],tot;
char a[1005][30];
inline int idx(char ch) {return ch-'a';}
void insert(char *a)
{
int k=0,len=strlen(a);
for (int i=0;i<len;i++)
{
int id=idx(a[i]);
if (!ch[k][id]) ch[k][id]=++tot;
k=ch[k][id];
val[k]++;
}
}
void ask(char *a)
{
int k=0,len=strlen(a);
for (int i=0;i<len;i++)
{
printf("%c",a[i]);
int id=idx(a[i]);
k=ch[k][id];
if (val[k]==1) break;
}
}
int main()
{
while (scanf("%s",a[++n])!=EOF) insert(a[n]);
for (int i=1;i<=n;i++)
{
printf("%s ",a[i]);
ask(a[i]);
printf("\n");
}
return 0;
}