标签:
#include <iostream>
#include <stdio.h>
#include <algorithm>
#include <math.h>
#include <string.h>
#define N 26
#define PI acos(-1.0)
using namespace std;
typedef struct Trie
{
int sum;
int flag;
struct Trie *next[N];
};
Trie *root=NULL;
{
Trie *p=(Trie *)malloc(sizeof(Trie));
p->sum=0;
p->flag=0;
for(int i=0;i<N;i++)
p->next[i]=NULL;
return p;
}
void creatTire(char *s)/*建树 这个可以作为模版*/
{
int i,len=strlen(s);
Trie *p=root;
for(i=0;i<len;i++)
{
int k=s[i]-‘a‘;
if(p->next[k]==NULL)
p->next[k]=Newnode();
p=p->next[k];
p->sum++;
}
p->flag=1;/*标记一个字符串的最后一个单词*/
}
void del(Trie *p)/*清除树*/
{
int i;
if(p==NULL)
return ;
for(i=0;i<N;i++)
if(p->next[i]!=NULL)
del(p->next[i]);
free(p);
}
int findTire(char *s)
{
Trie *p=root;
int n=strlen(s),i;
for(i=0;i<n;i++)
{
int j,k;
k=s[i]-‘a‘;
p=p->next[k];
if(p==NULL)
break;
if(p->flag==1&&i!=n-1)/*找到了匹配的前半部分*/
{
j=i+1;
Trie *q=root;
for(;j<n;j++)/*找后半部分*/
{
k=s[j]-‘a‘;
q=q->next[k];
if(q==NULL)
break;
return 2;/*返回2说明找到符合题意的了*/
}
}
}
return 0;
}
char s[51000][110];
int main()
{
int n,i=0,j;
root=Newnode();/*这儿要注意了 别忘了加上这一句*/
while(scanf("%s",s[i])!=EOF)/*有一些人说用ges错 就不太清楚了*/
{
creatTire(s[i]);
i++;
}
for(j=0;j<i;j++)
{
n=findTire(s[j]);
if(n==2)
printf("%s\n",s[j]);
}
return 0;
}
hdu 1247 Hat’s Words Trie树(+测试数据)
标签:
原文地址:http://www.cnblogs.com/yu0111/p/4708227.html