http://acm.hdu.edu.cn/showproblem.php?pid=1247
/*
注意结点数字的意义
刚开始还是用结点数字记录当前前缀出现的次数,结构一直出错,而找到下边例子后才发现问题。
特殊例子
a
s
d
asd
应该没有输出结果,但却输出了asd
why?
*/
题目大意:按字典序给出一些单词(不超过50000个),将那些由其它两个单词组合成的单词按字典序输出;
#include"iostream"
#include"string"
#define M 50001
#define N 50
using namespace std;
char s[M][N],s1[N],s2[N];
//结点结构
struct Node
{
int nCount;
Node *next[26];
}*root;
//初始化新结点
void Init(Node *p)
{
int i;
p->nCount=0;
for(i=0;i<26;i++){
p->next[i]=NULL;
}
}
//插入新单词
void Insert(char *s)
{
int i,k;
Node *p=root;
Node *newnode;
for(i=0;i<strlen(s);i++){
k=s[i]-'a';
if(p->next[k]==NULL){
newnode=new Node;
Init(newnode);
p->next[k]=newnode;
p=newnode;
}
else{
p=p->next[k];
}
}
p->nCount=1;//标记一个单词
}
//搜索单词
int Search(char *s)
{
int i,k;
Node *p=root;
for(i=0;i<strlen(s);i++){
k=s[i]-'a';
if(p->next[k]==NULL)
return 0;
else
p=p->next[k];
}
return p->nCount;
}
//释放内存
void Freedom(Node *p)
{
for(int i=0;i<26;i++){
if(p->next[i]!=NULL){
Freedom(p->next[i]);
}
}
delete p;
}
int main()
{
int i,j,k,l;
root=new Node;
Init(root);
int num=0;
while(gets(s[num])){
Insert(s[num]);
num++;
}
for(i=0;i<num;i++){
for(j=1;j<strlen(s[i]);j++){ //把单词从各个位置分成两个单词 s1,s2,判断是否同时出现过
for(k=0;k<j;k++)
s1[k]=s[i][k];
s1[k]='\0';
for(k=0,l=j;l<strlen(s[i]);k++,l++)
s2[k]=s[i][l];
s2[k]='\0';
if(Search(s1)&&Search(s2)){
cout<<s[i]<<endl;
break;
}
}
}
return 0;
}
分享到:
相关推荐
hdu 1166线段树
hdu 1166线段树代码
HDU的1250,主要是利用高精度加法,但是代码有点繁琐,效率不是很高
杭电ACMhdu1163
HDU1059的代码
hdu1001解题报告
hdu 1574 passed sorce
HDU的一题........HDU DP动态规
hdu acm 教案 搜索入门 hdu acm 教案 搜索入门
hdu2101AC代码
搜索 dfs 解题代码 hdu1241
hdu 5007 Post Robot 字符串枚举。 暴力一下就可以了。
hdu acm 教案 动态规划(1) hdu acm 教案 动态规划(1)
ACM HDU题目分类,我自己总结的大概只有十来个吧
hdu1290 解题报告 献给杭电五十周年校庆的礼物 (切西瓜问题,即平面分割空间)
HDU最全ac代码
NULL 博文链接:https://128kj.iteye.com/blog/1734821
hdu动态规划算法集锦
自己做的HDU ACM已经AC的题目
hdu题目分类