题目是汉语的
连接:帽子
这题是非常简单的字典树的模板题,但当时却没看出来,我这人就怕超时,当时我感觉用字典树后还得一个一个的查询可能会超时,因此我就没有用,其实就是很传统的方法:将所有的单词加入到字典树中(这些单词要保存),然后一个n次的循环,看看是不是帽子单词,只要把单词分成c1,c2两部分看看这俩存不存在于字典树中~~当时我还错了一个地方就是在字典树中查询哎。。。
AC代码:
#include<iostream>
#include <stdio.h>
#include <string.h>
using namespace std;
struct Tire
{
Tire *next[26];
int cnt;
Tire()
{
memset(next,0,sizeof(next));
cnt=-1;
}
};
Tire*root;
void Insert(char msg[])
{
int i=0;
Tire *cur=root;
int k;
while(msg[i])
{
k=msg[i]-'a';
if(cur->next[k]==NULL)
cur->next[k]=new Tire();
cur=cur->next[k];
i++;
}
cur->cnt=1;
}
int FindTire(char msg[])
{
int i=0;
Tire*cur=root;
while(msg[i])
{
int k=msg[i]-'a';
if(cur->next[k]!=NULL)
cur=cur->next[k];
else
return -1;
i++;
}
return cur->cnt;
}
char word[50005][17];
/*因为内存是动态申请的,因此要用delete删除*/
void del(Tire*head)
{
for(int i=0;i<26;i++)
if(head->next[i]!=NULL)
del(head->next[i]);
delete head;
}
int main()
{
int n=0;
root=new Tire();
while(scanf("%s",word[n])!=EOF)
{
Insert(word[n]);
n++;
/* if(n==6)
break;*/
}
for(int i=0;i<n;i++)
{
int len=strlen(word[i]);
char c1[50]={'\0'};
char c2[50]={'\0'};
for(int j=1;j<len;j++)
{
strcpy(c1,word[i]);
c1[j]='\0';
strcpy(c2,word[i]+j);
if(FindTire(c1)==1 &&FindTire(c2)==1)
{
printf("%s\n",word[i]);
break;
}
}
}
del(root);
return 0;
}