这个题,是将一个字符串拆开进字典树。这个还是蛮经典的。
其中也有点需要注意的地方
代码
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
#define maxn 26
typedef struct Trie
{
int v;
Trie *next[maxn];
};
char s[50005][120];
Trie *root;
void create(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->v=0;
for(int j=0;j<maxn;j++)
q->next[j]=NULL;
p->next[id]=q;
p=p->next[id];
}
else
{
p=p->next[id];
}
}
p->v=1;
}
int findT(char *str)
{
int len = strlen(str);
Trie *p=root;
for(int i=0;i<len;i++)
{
int id= str[i]-'a';
if(p->next[id]==NULL)
return 0;
p=p->next[id];
}
return p->v;
}
int main()
{
int num=0;
root=new Trie;
root->v=0;
for(int h=0;h<maxn;h++)
root->next[h]=NULL;
while(scanf("%s",s[num])!=EOF)
{
create(s[num]);
num++;
}
char a[120],b[120];
for(int j=0;j<num;j++)
{
int len=strlen(s[j]);
for(int k=0;k<len;k++)
{
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
strncpy(a,s[j],k);
strncpy(b,s[j]+k,len-k);
if(findT(a)==1&&findT(b)==1)
{
printf("%s\n",s[j]);
break;//这里的break如果不加的话,同一个字符串可能输出两次。
}
}
}
return 0;
}