Hat’s Words
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1247
字典树题目: 建字典树,然后将一个单词分两个部分在字典树中查找!!
用结构体封装一下,感觉还行~~
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>水水更健康<<<<<<<<<<<<<<<<<<<<<<<<<<<
#include<cstdio>
#include<cstring>
#include<cctype>
#include<cmath>
#include<set>
#include<map>
#include<list>
#include<queue>
#include<deque>
#include<stack>
#include<string>
#include<vector>
#include<iostream>
#include<algorithm>
#include<stdlib.h>
#include<time.h>
using namespace std;
typedef long long LL;
const int INF=2e9+1e8;
const int MOD=1e9+7;
const int MAXSIZE=2e4+100;
const double eps=0.0000000001;
void fre()
{
freopen("in.txt","r",stdin);
freopen("out.txt","w",stdout);
}
#define memst(a,b) memset(a,b,sizeof(a))
#define fr(i,a,n) for(int i=a;i<n;i++)
struct dicTree
{
struct Node
{
int sum;
int next[26];
}Tree[200000];
int root,sz;
int newnode()
{
for(int i=0;i<26;i++) Tree[sz].next[i]=-1;
Tree[sz++].sum=0;
return sz-1;
}
void init()
{
sz=0;
root=newnode();
}
void insert(string& s,int len)
{
int now=root;
for(int i=0;i<len;i++)
{
int to=(int)(s[i]-'a');
if(Tree[now].next[to]==-1) Tree[now].next[to]=newnode();
now=Tree[now].next[to];
}
Tree[now].sum++;
}
bool find(string& s,int start,int len)
{
int now=root;
for(int i=start;i<len;i++)
{
int to=(int)(s[i]-'a');
if(Tree[now].next[to]==-1) return false;
if(Tree[now].sum&&(!start)&&find(s,i,len)) return true;
now=Tree[now].next[to];
}
if(start&&Tree[now].sum) return true;
return false;
}
};
dicTree AC;
string input[50009];
int main()
{
AC.init();
int tot=0;
while(cin>>input[tot]) AC.insert(input[tot],(int)input[tot].size()),tot++;
for(int i=0;i<tot;i++)
{
if(AC.find(input[i],0,(int)input[i].size())) cout<<input[i]<<endl;
}
return 0;
}
/**************************************************/
/** Copyright Notice **/
/** writer: wurong **/
/** school: nyist **/
/** blog : http://blog.csdn.net/wr_technology **/
/**************************************************/