您的位置:首页 > 其它

HDU - 1247 Hat’s Words(Trie 字典树)

2017-03-13 16:51 405 查看
之前用hash做过这题后面想一下其实字典树也是一样的

只要把hash的建立过程替换成建立字典树就可以了速度上更快一点

不过空间消耗大。

hash链接->hash AC代码

字典树AC代码

#include<stdio.h>
#include<string.h>
struct Trie
{
struct node
{
int flag;
int next[26];
void init()
{
for(int i=0;i<26;i++)
next[i]=-1;
}
};
int top;
node p[100050];
void init()
{
p[0].init();
top=1;
}
void insert(char *s)
{
int pp=0;
for(int i=0;s[i];i++)
{
if(p[pp].next[s[i]-'a']==-1)
{
p[pp].next[s[i]-'a']=top;
p[top].init();
top++;
}
pp=p[pp].next[s[i]-'a'];
}
p[pp].flag=1;
}
bool query(char *s)
{
int pp=0;
for(int i=0;s[i];i++)
{
if(p[pp].next[s[i]-'a']==-1)
return false;
pp=p[pp].next[s[i]-'a'];
}
return pp!=-1&&p[pp].flag;
}
}T;
char a[100010][20];
int main()
{
T.init();
int cnt=0;
while(scanf("%s",a[cnt])==1&&a[cnt][0]!='\0')
{
T.insert(a[cnt]);
cnt++;
}
char s1[20],s2[20];
for(int i=0;i<cnt;i++)
{

int flog=0;
for(int j=0;j<a[i][j+1]!='\0';j++)
{
s1[j]=a[i][j];
s1[j+1]='\0';
if(T.query(s1))
{
int k;
for(k=0;a[i][j+k+1]!='\0';k++)
s2[k]=a[i][j+k+1];

s2[k]='\0';
if(T.query(s2))
{
printf("%s\n",a[i]);
flog=1;
break;
}
}
if(flog)
break;
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: