hdu1251 && hud 1247 (字典树)
这道题,主要是在主函数的输入输出上犹豫了。
#include<stdio.h>
#include<cstring>
#include<iostream>
using namespace std;
#include<algorithm>
const int Max = 1e6+5;
struct Trie{
Trie * next[26];
int cnt;
};
int malloc_p=0;
Trie memory[Max];
Trie *creat()
{
Trie * t = &memory[malloc_p++];
t->cnt=1;
for(int i=0;i<26;i++)
t->next[i]=NULL;
return t;
}
void _insert(Trie *root,char* str)
{
Trie* p=root;
for(int i=0;str[i]!='\0';i++)
{
int k=str[i]-'a';
if(p->next[k]) p->next[k]->cnt++;
else p->next[k]=creat();
p=p->next[k];
}
}
int _search(Trie *root ,char* str)
{
Trie *p = root;
for(int i=0;str[i]!=0;i++)
{
int k = str[i]-'a';
if(p->next[k]) p=p->next[k];
else return 0;
}
return p->cnt;
}
int main()
{
char str[15];
Trie *root = creat();
while(gets(str)&&strlen(str)!=0){
_insert(root,str);}
while(cin>>str){
int ans=_search(root,str);
printf("%d\n",ans);
}
return 0;
}
题目大意:
就是找出一个单词,前半部是一个出现过的单词,后半部也是,记住,要严格满足这个条件
所以,其实也就是先查找一个单词的是否有前缀,再用这个单词除去前缀的部分查找是否存在一个这样的单词
虽然题目说按字典序输出,但本身已经是按字典序输入了,所以排序也就省了
#include<stdio.h>
#include<cstring>
#include<iostream>
using namespace std;
#include<algorithm>
struct Trie{
Trie * next[26];
int cnt;
};
Trie *root;
int malloc_p=0;
char str[50004][14];
void _insert(char* s)
{
Trie* p=root;
for(int i=0;s[i]!='\0';i++)
{
int k=s[i]-'a';
if(p->next[k]==NULL)
p->next[k]=new Trie();
p=p->next[k];
}
p->cnt=1;
}
int _search2(char* s)
{
Trie *p = root;
for(int i=0;s[i]!='\0';i++)
{
int k = s[i]-'a';
if(p->next[k])
{
p=p->next[k];
if(p->cnt==1&&s[i+1]=='\0')//
return 1;
}
else return 0;
}
return 0;
}
int _search(char* s)
{
Trie *p = root;
for(;*s!='\0';)
{
int k = *s-'a';
if(p->next[k])
{
p=p->next[k];
if(p->cnt==1&& _search2(s+1) )//
return 1;
s++;
}
else return 0;
}
return 0;
}
int main()
{
int i=0;
root = new Trie();
while(cin>>str[i]){
_insert(str[i]);
i++;
}
for(int j=0;j<i;j++){
if(_search(str[j]))
cout<<str[j]<<endl;
}
return 0;
}
博客上很多人说这道题挺简单的,但是我还是做了好长时间,可能是因为才开始接触字典树,还不太熟悉吧,
下面是转载的别人的代码:map+string
感觉挺简单的,但是现在还没有学map ,以后应该看得懂吧
- #include <iostream>
- #include <string>
- #include <map>
- using namespace std;
- map <string, int> m_v;
- string str[50006];
- int main() {
- int k(-1);
- while(cin >> str[++k]) {
- m_v[str[k]] = 1;
- }
- for(int i = 0; i <= k; i++) {
- int e = str[i].size()-1;
- for(int j = 1; j < e; j++) {
- string s1(str[i], 0, j);
- string s2(str[i], j);
- if(m_v[s1] == 1 && m_v[s2] == 1) {
- cout << str[i] << endl;
- break;
- }
- }
- }
- return 0;
- }
hdu1251 && hud 1247 (字典树)的更多相关文章
- Hat’s Words HDU - 1247 字典树
题意:给出数个单词 输出单词 如果该单词 是由字典中的单词组成的 思路:字典树 先把全部建树 然后对于每一个单词进行分割,分别拿两半到字典树里面去找 小心RE! #include<bits/s ...
- hdu 1247 (字典树入门)
Hat’s Words Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total ...
- HDU-1251 统计难题,字典树或者map!
统计难题 很久就看过这个题了,但不会~~~不会~~ 题意:给出一张单词表,然后下面有若干查询,每次给出一个单词,问单词表中是否存在以这个单词为前缀的单词,输出数量.本身也是自身的前缀.只有一组数据! ...
- hdu1251 hash或者字典树
题意: 统计难题 Problem Description Ignatius最近遇到一个难题,老师交给他很多单词(只有小写字母组成,不会有重复的单词出现),现在老师要他统计出以某个字符串为前缀的单词数量 ...
- hdu1251 统计难题 字典树
Problem Description Ignatius最近遇到一个难题,老师交给他很多单词(只有小写字母组成,不会有重复的单词出现),现在老师要他统计出以某个字符串为前缀的单词数量(单词本身也是自己 ...
- 字典树模板题(统计难题 HDU - 1251)
https://vjudge.net/problem/HDU-1251 标准的字典树模板题: 也注意一下输入方法: #include<iostream> #include<cstdi ...
- hdu1251(字典树)
统计难题(hdu1251) Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 131070/65535 K (Java/Others) Tota ...
- hdoj 1247 Hat’s Words(字典树)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1247 思路分析:题目要求找出在输入字符串中的满足要求(该字符串由输入的字符串中的两个字符串拼接而成)的 ...
- hdu1251+字典树常用模板
这里只简单给出几个常用的字典树的模板,要看具体介绍的请看:传送门 Problem Description Ignatius最近遇到一个难题,老师交给他很多单词(只有小写字母组成,不会有重复的单词出现) ...
随机推荐
- hivepython 实现一行转多行
案例1: ==效果等同于一行转多行 数据表名称:zhangb.gid_tags 数据格式,每行是2个字段,(gid,tags) ,可能有脏数据,分隔符为“\t”, ANDROID-9de77225 ...
- Syncthing搭建
现在貌似只有windows和linux比较号装. 安装 先从官网下载好Windows 32位版(我本本对应的系统版本)的Syncthing,解压后可以看到如下文件结构 Syncthing文件结构 ...
- sqlite小知识
删除数据时,由于缓存关系,数据了文件大小不会一下子减小,可以通过执行vacuum;或新建表时使用自动整理大小来实现. sqlite的大小理论上可以达到140T. 暂时,使用C的api,只能使用不是.开 ...
- 【校招面试 之 C/C++】第25题 C++ 智能指针(一)之 auto_ptr
1.智能指针背后的设计思想 我们先来看一个简单的例子: void remodel(std::string & str) { std::string * ps = new std::string ...
- 苹果 重置APPID密保问题及更新开发者协议
[链接]重置AppleID密保问题 https://www.jianshu.com/p/37e7f2852eda [链接]苹果开发者计划许可协议更新:持续更新 https://www.jianshu. ...
- springboot的yaml基础语法与取值,配置类,配置文件加载优先级
1.基本语法k:(空格)v:表示一对键值对(一个空格必须有):以空格的缩进来控制层级关系:只要是左对齐的一列数据,都是同一个层级的属性和值也是大小写敏感: server: port: 8081 pat ...
- linux 下 php 安装 Gearman
Gearman是一个分发任务的程序框架,它会对作业进行排队自动分配到一系列机器上.gearman跨语言跨平台,很方便的实现异步后台任务. 一个Gearman请求的处理过程涉及三个角色: Clien ...
- Castle ActiveRecord学习(二)配置、引用、程序启动
来源:http://www.cnblogs.com/zxj159/p/4082987.html 配置数据库驱动: Model层引用:Castle.ActiveRecord.dll.NHibernate ...
- 团队项目:二次开发--v.2.1--软件工程
原先代码,对于基本对象的Get,Set方法构造函数等方法与实现基本功能的方法统一放到了一起,容易造成代码不清晰,别人比较难阅读的情况.而且其中代码冗余比较多. 改进代码,进行了层次的分析,将基本对象与 ...
- PAT 1048 数字加密(20)(代码+思路)
1048 数字加密(20)(20 分) 本题要求实现一种数字加密方法.首先固定一个加密用正整数A,对任一正整数B,将其每1位数字与A的对应位置上的数字进行以下运算:对奇数位,对应位的数字相加后对13取 ...