标签:
Description
Input
Output
Sample Input
Sample Output
#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 *Newnode()/*初始化树*/ { 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; if(q->flag==1&&j==n-1)/*j==n-1表示完全匹配*/ return 2;/*返回2说明找到符合题意的了*/ } //return 1;/*在这错了好久,要是找到了前半部分但是没找到匹配的后半部分应该把前半部分的下标向后移,继续判断!*/ } } 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]); } //del(root); return 0; }
hdu 1247 Hat’s Words Trie树(+测试数据)
标签:
原文地址:http://www.cnblogs.com/yu0111/p/4727696.html