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最近遇到一个难题,老师交给他很多单词(只有小写字母组成,不会有重复的单词出现) ...
 
随机推荐
- android笔记:Service
			
服务:在后台运行,没有界面的组件. 服务生命周期如下: 两种启动方式: 1.startService(): onCreate()-->onStartCommand()-->onDestro ...
 - Spring依赖注入:基于xml配置
			
基础接口 BeanFactory.ApplicationContext. BeanFactory用于创建并管理.获取各种类的对象. ApplicationContext从BeanFactory派生而来 ...
 - Linux 查看当前时间
			
一.查看和修改Linux的时区1. 查看当前时区命令 : "date -R"2. 修改设置Linux服务器时区方法 A命令 : "tzselect"方法 B 仅 ...
 - 第八章 高级搜索树 (b2)B-树:结构
 - Pocket Cube
			
Pocket Cube http://acm.hdu.edu.cn/showproblem.php?pid=5983 Time Limit: 2000/1000 MS (Java/Others) ...
 - OptionParser模块学习
			
from optparse import OptionParser import sys useage = [] test_parser = OptionParser(usage="%pro ...
 - python的进程间的数据交互
			
#先来看下如何实现多进程 # multiprocessing 这个是python的多进程的模块,我们会用到这个模块的很多方法 from multiprocessing import Process i ...
 - 对于局部变量,text、ntext 和 image 数据类型无效
			
开发存储过程时报如上错误.大多数人说用varchar(8000)代替text,但值我这里超过8000,不可取 解决: sql2005或以上版本支持新数据类型:varchar(max)nvarchar( ...
 - Java多线程超详细总结
			
目录(?)[-] 一扩展javalangThread类 二实现javalangRunnable接口 三Thread和Runnable的区别 四线程状态转换 五线程调度 六常用函数说明 使用方式 为什么 ...
 - JSP页面中的EL表达式介绍
			
1.什么是EL? Expression Language(表达式语言) 2.EL的功能 替代JSP页面中数据访问时的复杂编码. 3.EL的特点 自动转换类型 使用简单 4.EL表达式的语法 ${EL ...