思路:
改造字典树模板,Search在访问节点时如果发现单词结尾对剩下部分进行查询,若剩下部分正好对应另一个单词就输出。
TIP:
题目说要按字典序输出,但是貌似是不用的...
#include <iostream>
#include <string.h>
#include <stdio.h>
#include <algorithm>
using namespace std;
const int b='a';
const int cz=1000000;
char a[50050][50];
string b1[50050];
struct trie
{
int a[cz][26];
bool flag[cz];
int sz;
int ipx(char a)
{
return a-'a';
}
trie()
{
sz=1;
memset(a[0],0,sizeof(a[0]));
memset(flag,0,sizeof(flag));
}
void insert(char inp[])
{
int u=0;
int len=strlen(inp);
for(int i=0;i<len;i++)
{
int c=ipx(inp[i]);
if(a[u][c]==0)
{
memset(a[sz],0,sizeof(a[sz]));
a[u][c]=sz;
sz++;
}
u=a[u][c];
//cout<<u<<endl;
}
flag[u]=1;
}
bool search(char inp[])
{
int len=strlen(inp);
int u=0;
for(int i=0;i<len;i++)
{
//cout<<inp[i];
int c=ipx(inp[i]);
u=a[u][c];
if(flag[u]==1&&i+1<len)
{
int u1=0;
for(int j=i+1;j<len;j++)
{
//cout<<"/"<<inp[j];
int d=ipx(inp[j]);
u1=a[u1][d];
if(u1==0) break;
}
if(flag[u1]==1&&u1!=0)
return 1;
}
if(u==0) break;
}
return 0;
}
}tree;
int main()
{
//freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
int con=0,ans=0;
while(scanf("%s",a[con++])!=EOF);
for(int i=0;i<con;i++)
tree.insert(a[i]);
for(int i=0;i<con;i++)
if(tree.search(a[i])==1)
b1[ans++]=a[i];
for(int i=0;i<ans;i++)
cout<<b1[i]<<endl;
//else printf("check\n");
return 0;
}