hdu 1247

来源:互联网 发布:淘宝货到付款合约中 编辑:程序博客网 时间:2024/05/09 12:16

http://acm.hdu.edu.cn/showproblem.php?pid=1247

#include"stdio.h"#include"stdlib.h"#include"string.h"#include"algorithm"using namespace std;char xx[50005][1001];struct Trie{struct Trie * next[26];int flag;};Trie * H = NULL;Trie * init(){Trie * t = new Trie;for(int i = 0;i < 26;i++){t ->next[i] = NULL;}t ->flag = 0;return t;}void Add(char * s){Trie * l = H;int len = strlen(s);for(int i = 0;i < len;i++){int k = s[i] - 'a';if(l ->next[k] == NULL){l ->next[k] = init();}l = l ->next[k];}l ->flag = 1;   //用来标记单词存不存在 }int Cr(char * s,int x)  //判断另一半 {Trie * l = H;int len = strlen(s);for(int i = x;i < len;i ++){int k = s[i] - 'a';if(l ->next[k] == NULL)  //中间断了,直接退出 return 0;l = l ->next[k];}if(l ->flag)   //只判断结尾有没有这个单词 return 1;elsereturn 0;}int Search(char * s) //查找单词 {Trie * l = H;int len = strlen(s);int pl = 0;     //判断找没找到 for(int i = 0;i < len;i ++){int k = s[i] - 'a';if(l ->next[k] == NULL)return 0;if(l ->flag) //先找到前一半  {if(Cr(s,i))  //然后判断另一半 {pl = 1;return 1;   //返回真直接找到,否则继续找 }}l = l->next[k];}if(pl)    //找到了返回真 return 1;elsereturn 0;}void Cls(Trie * l)   //清空数组 {for(int i = 0;i < 26;i ++){if(l ->next[i] != NULL){Cls(l ->next[i]);}}free(l);}int main(){int a,b,c,d = 0;H = init();while(~scanf("%s",xx[d ++])){Add(xx[d - 1]);}for(int i = 0;i < d;i ++){if(Search(xx[i]))puts(xx[i]);}return 0;}

 

0 0
原创粉丝点击