字典树
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <map>
#include <cstdlib>
using namespacestd;
struct node
{
bool flag;
node *next[26];
}*root;
node *build()
{
node *p = (node *)malloc(sizeof(node));
for(int i =0; i < 26; i ++)
p -> next[i] =NULL;
p -> flag =false;
return p;
}
void save(char *s)
{
node *p;
p = root;
int len =strlen(s);
for(int i =0; i < len; i ++)
{
if(p ->next[s[i] - 'a'] ==NULL)
p -> next[s[i] -'a'] = build();
p = p -> next[s[i] -'a'];
}
p -> flag =true;
}
int query(char *s)
{
node *p;
p = root;
int len =strlen(s);
for(int i =0; i < len; i ++)
{
if(p ->next[s[i]- 'a'] ==NULL)
return0;
p = p -> next[s[i] -'a'];
}
if(p ->flag) return1;
elsereturn 0;
}
int main()
{
root =build();
char str[50005][20];
int n =0;
while(~scanf("%s",str[n]))
{
save(str[n]);
n ++;
}
for(int i =0; i < n; i ++)
{
char a[20],b[20];
int len =strlen(str[i]);
for(int j =0; j < len; j ++)
{
memset(a,'\0', sizeof(a));
memset(b,'\0', sizeof(b));
strncpy(a, str[i], j);//单词前半部
strncpy(b, str[i] + j, len - j);//单词后半部
if(query(a) &&query(b))
{
printf("%s\n",str[i]);
break;
}
}
}
return0;
}
这是一种用了map记录的方法
这样做很省事
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<algorithm>
#include<map>
using namespacestd;
map<string,int>mp;
char ch[50000][50];
int main()
{
int m=0;
while(~scanf("%s",ch[m]))//gets(ch[m])
{
//if(n==0)
// break;
mp[ch[m]]++;
m++;
}
char str1[50],str2[50];
for(int i=0;i<m;i++)
{
int k=strlen(ch[i]);
for(int j=1;j<k;j++)
{
strcpy(str1,ch[i]);
str1[j]='\0';
strcpy(str2,ch[i]+j);
if(mp[str1]!=0&&mp[str2]!=0)
{
printf("%s\n",ch[i]);
break;
}
}
}
return0;
}