hdu1247(字典树模板)
2017-07-13 16:37
316 查看
字典树
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <map>
#include <cstdlib>
using namespacestd;
struct node
{
bool flag;
node *next[26];
}*root;
node *build()
{
node *p = (node *)malloc(sizeof(node));
for(int i =0; i <
26; i ++)
p -> next[i] =NULL;
p -> flag =false;
return p;
}
void save(char *s)
{
node *p;
p = root;
int len =strlen(s);
for(int i =0; i < len; i ++)
{
if(p ->next[s[i] -
'a'] ==NULL)
p -> next[s[i] -'a'] =
build();
p = p -> next[s[i] -'a'];
}
p -> flag =true;
}
int query(char *s)
{
node *p;
p = root;
int len =strlen(s);
for(int i =0; i < len; i ++)
{
if(p ->next[s[i]-
'a'] ==NULL)
return0;
p = p -> next[s[i] -'a'];
}
if(p ->flag)
return1;
elsereturn
0;
}
int main()
{
root =build();
char str[50005][20];
int n =0;
while(~scanf("%s",str
))
{
save(str
);
n ++;
}
for(int i =0; i < n; i ++)
{
char a[20],b[20];
int len =strlen(str[i]);
for(int j =0; j < len; j ++)
{
memset(a,'\0',
sizeof(a));
memset(b,'\0',
sizeof(b));
strncpy(a, str[i], j);//单词前半部
strncpy(b, str[i] + j, len - j);//单词后半部
if(query(a) &&query(b))
{
printf("%s\n",str[i]);
break;
}
}
}
return0;
}
这是一种用了map记录的方法
这样做很省事
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<algorithm>
#include<map>
using namespacestd;
map<string,int>mp;
char ch[50000][50];
int main()
{
int m=0;
while(~scanf("%s",ch[m]))//gets(ch[m])
{
//if(n==0)
// break;
mp[ch[m]]++;
m++;
}
char str1[50],str2[50];
for(int i=0;i<m;i++)
{
int k=strlen(ch[i]);
for(int j=1;j<k;j++)
{
strcpy(str1,ch[i]);
str1[j]='\0';
strcpy(str2,ch[i]+j);
if(mp[str1]!=0&&mp[str2]!=0)
{
printf("%s\n",ch[i]);
break;
}
}
}
return0;
}
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <map>
#include <cstdlib>
using namespacestd;
struct node
{
bool flag;
node *next[26];
}*root;
node *build()
{
node *p = (node *)malloc(sizeof(node));
for(int i =0; i <
26; i ++)
p -> next[i] =NULL;
p -> flag =false;
return p;
}
void save(char *s)
{
node *p;
p = root;
int len =strlen(s);
for(int i =0; i < len; i ++)
{
if(p ->next[s[i] -
'a'] ==NULL)
p -> next[s[i] -'a'] =
build();
p = p -> next[s[i] -'a'];
}
p -> flag =true;
}
int query(char *s)
{
node *p;
p = root;
int len =strlen(s);
for(int i =0; i < len; i ++)
{
if(p ->next[s[i]-
'a'] ==NULL)
return0;
p = p -> next[s[i] -'a'];
}
if(p ->flag)
return1;
elsereturn
0;
}
int main()
{
root =build();
char str[50005][20];
int n =0;
while(~scanf("%s",str
))
{
save(str
);
n ++;
}
for(int i =0; i < n; i ++)
{
char a[20],b[20];
int len =strlen(str[i]);
for(int j =0; j < len; j ++)
{
memset(a,'\0',
sizeof(a));
memset(b,'\0',
sizeof(b));
strncpy(a, str[i], j);//单词前半部
strncpy(b, str[i] + j, len - j);//单词后半部
if(query(a) &&query(b))
{
printf("%s\n",str[i]);
break;
}
}
}
return0;
}
这是一种用了map记录的方法
这样做很省事
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<algorithm>
#include<map>
using namespacestd;
map<string,int>mp;
char ch[50000][50];
int main()
{
int m=0;
while(~scanf("%s",ch[m]))//gets(ch[m])
{
//if(n==0)
// break;
mp[ch[m]]++;
m++;
}
char str1[50],str2[50];
for(int i=0;i<m;i++)
{
int k=strlen(ch[i]);
for(int j=1;j<k;j++)
{
strcpy(str1,ch[i]);
str1[j]='\0';
strcpy(str2,ch[i]+j);
if(mp[str1]!=0&&mp[str2]!=0)
{
printf("%s\n",ch[i]);
break;
}
}
}
return0;
}
相关文章推荐
- hdu1247 Hat’s Words(字典树:模板+枚举)
- hdu1247 字典树模板
- hdu1247(字典树+枚举)
- HDU1251(静态维护字典树模板题)
- hdu1521(字典树模板)
- 创建字典树模板
- 字典树模板
- HDU 1251 统计难题 (字典树模板题)
- HDOJ1671 字典树入门题+模板程序(指针实现)
- 字典树(Trie树)模板
- 字典树模板(数组实现和指针实现)
- HDU 1251 统计难题 (字典树基本模板,有详细注释)
- 字典树——字典树树模板
- 链表 之 字典树(讲解+模板)的构建
- 字典树模板
- 字典树 模板
- 字典树模板
- HDU 1251 统计难题(字典树模板)
- 字典树模板
- 字典树模板