您的位置:首页 > 其它

hdu 1247 Hat’s Words

2016-07-26 23:13 204 查看
题意:给你一些字符串,找出哪些字符串是由给的字符串中某两个字符串组成。

解法:字典树,把给的字符串放进字典树,然后枚举每一个字符串,拆分当前字符串,然后到字典树中去找。

#include<bits/stdc++.h>
using namespace std;
char str[50005][100];
struct node
{
int cnt;
node *next[26];
node()
{
cnt=0;
for(int i=0;i<26;i++)
next[i]=NULL;
}
}*root;
void mt(char *s)
{
node *p=root;
int len=strlen(s);
for(int i=0;i<len;i++)
{
int j=s[i]-'a';
if(p->next[j]==NULL)
{
p->next[j]=new node;
p=p->next[j];
}
else
p=p->next[j];
}
p->cnt++;
}
bool sm(char *ss)
{
node *p=root;
int len=strlen(ss);
for(int i=0;i<len;i++)
{
int j=ss[i]-'a';
if(p->next[j]==NULL)
return false;
p=p->next[j];
}
if(p->cnt)
return true;
}
void dt(node *T)
{
if(T==NULL)
return;
for(int i=0;i<26;i++)
if(T->next[i]!=NULL)
dt(T->next[i]);
free(T);
return;
}
int main()
{
root=new node;
int k=0;
while(scanf("%s",str[k])!=EOF)
{
mt(str[k]);
k++;
}
for(int i=0;i<k;i++)
{
int len=strlen(str[i]),j;
char st[100],sst[100];
for(j=1;j<len;j++)
{
int v;
for(v=0;v<j;v++)
sst[v]=str[i][v];
sst[v]='\0';
strncpy(st,str[i]+j,len-j);
st[len-j]='\0';
if(sm(sst)&&sm(st))
{
printf("%s\n",str[i]);
break;
}
}
}
dt(root);
return 0;
}


 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: