Tire树入门专题
POJ 3630Phone List
题目连接:http://poj.org/problem?id=3630
题意:问是否有号码是其他号码的前缀。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<map>
using namespace std;
const int N=1e5+;
struct Tire
{
int T[N][];
int sum[N];
int cou;
void init()
{
cou=;
memset(T,,sizeof(T));
memset(sum,,sizeof(sum));
}
void Insert(char *s)
{
int h=,i,n=strlen(s);
for(i=; i<n; i++)
{
if(T[h][s[i]-'']==)
T[h][s[i]-'']=cou++;
h=T[h][s[i]-''];
}
sum[h]++;
}
int ask(char *s)
{
int h=,i=,n=strlen(s);
for(i=; i<n-; i++)
{
if(T[h][s[i]-''])
{
h=T[h][s[i]-''];
if(sum[h]>) return ;
}
else return ;
}
return ;
}
} tire;
char s[][];
int main()
{
int i,T,n;
scanf("%d",&T);
while(T--)
{
int ans=;
scanf("%d",&n);
getchar();
tire.init();
for(i=; i<n; i++)
{
scanf("%s",s[i]);
getchar();
tire.Insert(s[i]);
}
for(i=; i<n; i++)
if(tire.ask(s[i])) ans=;
if(ans==) cout<<"NO"<<endl;
else cout<<"YES"<<endl;
}
return ;
}
POJ 3630
HDU 1251统计难题
题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=1251
题意:统计出以某个字符串为前缀的单词数量(单词本身也是自己的前缀).
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int N=5e5+;
struct Tire
{
int T[N][],sum[N];
int cou;
void Init()
{
cou=;
memset(T,,sizeof(T));
memset(sum,,sizeof(sum));
}
void Insert(char *s)
{
int i,h=,n=strlen(s);
for(i=; i<n; i++)
{
if(T[h][s[i]-'a']==)
T[h][s[i]-'a']=cou++;
h=T[h][s[i]-'a'];
sum[h]++;
}
}
int ask(char *s)
{
int i,h=,n=strlen(s);
for(i=; i<n; i++)
{
if(T[h][s[i]-'a']!=) h=T[h][s[i]-'a'];
else return ;
}
return sum[h];
}
} tire;
int main()
{
char s[];
tire.Init();
while(gets(s))
{
if(strlen(s)==) break;
tire.Insert(s);
}
while(scanf("%s",s)!=EOF)
{
cout<<tire.ask(s)<<endl;
}
return ;
}
HDU 1251
HDU 1004Let the Balloon Rise
题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=1004
题意:输出颜色数量最多的一种颜色。
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int N=+;
struct Tire
{
int T[N][],sum[N];
int cou;
void Init()
{
cou=;
memset(T,,sizeof(T));
memset(sum,,sizeof(sum));
}
int Insert(char *s)
{
int i,h=,n=strlen(s);
for(i=; i<n; i++)
{
if(T[h][s[i]-'a']==)
T[h][s[i]-'a']=cou++;
h=T[h][s[i]-'a'];
}
sum[h]++;
return sum[h];
}
} tire;
int main()
{
int n;
char s[],ans[];
while(scanf("%d",&n)!=EOF)
{
if(n==) break;
tire.Init();
int Max=;
while(n--)
{
getchar();
scanf("%s",s);
int x=tire.Insert(s);
if(x>Max)
{
Max=x;
strcpy(ans,s);
}
}
printf("%s\n",ans);
}
return ;
}
HDU 1004
HDU 4825Xor Sum
题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=4825
题意:在集合当中找出一个正整数 K ,使得 K 与 S 的异或结果最大。
思路:尽量使得K的高位与S的高位不同。
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int N=3e6+;
struct Tire
{
int T[N][],sum[N];
int cou;
void Init()
{
cou=;
memset(T,,sizeof(T));
memset(sum,,sizeof(sum));
}
void Insert(int num)
{
int i=,h=;
for(i=; i>=; i--)
{
if(T[h][(num>>i)&]==)
T[h][(num>>i)&]=cou++;
h=T[h][(num>>i)&];
}
sum[h]=num;
}
int ask(int num)
{
int i=,h=;
for(i=; i>=; i--)
{
int x=(num>>i)&,sign=;
if(x==) sign=;
if(T[h][sign]) h=T[h][sign];
else h=T[h][x];
}
return sum[h];
}
} tire;
int main()
{
int n,m;
int t,T;
scanf("%d",&T);
for(t=; t<=T; t++)
{
tire.Init();
scanf("%d%d",&n,&m);
int num;
while(n--)
{
scanf("%d",&num);
tire.Insert(num);
}
printf("Case #%d:\n",t);
while(m--)
{
scanf("%d",&num);
cout<<tire.ask(num)<<endl;
}
}
return ;
}
HDU 4825
Tire树入门专题的更多相关文章
- tire 树入门
博客: 模板: 前缀是否出现: /* trie tree的储存方式:将字母储存在边上,边的节点连接与它相连的字母 trie[rt][x]=tot:rt是上个节点编号,x是字母,tot是下个节点编号 * ...
- Trie树入门
Trie树入门 貌似很多人会认为\(Trie\)是字符串类型,但是这是数据结构!!!. 详情见度娘 下面开始进入正题. PS:本文章所有代码未经编译,有错误还请大家指出. 引入 先来看一个问题 给 ...
- 主席树入门(区间第k大)
主席树入门 时隔5个月,我又来填主席树的坑了,现在才发现学算法真的要懂了之后,再自己调试,慢慢写出来,如果不懂,就只会按照代码敲,是不会有任何提升的,都不如不照着敲. 所以搞算法一定要弄清原理,和代码 ...
- poj 3841 Double Queue (AVL树入门)
/****************************************************************** 题目: Double Queue(poj 3481) 链接: h ...
- Codeforces 714C. Sonya and Queries Tire树
C. Sonya and Queries time limit per test:1 second memory limit per test: 256 megabytes input:standar ...
- 中文分词系列(二) 基于双数组Tire树的AC自动机
秉着能偷懒就偷懒的精神,关于AC自动机本来不想看的,但是HanLp的源码中用户自定义词典的识别是用的AC自动机实现的.唉-没办法,还是看看吧 AC自动机理论 Aho Corasick自动机,简称AC自 ...
- 中文分词系列(一) 双数组Tire树(DART)详解
1 双数组Tire树简介 双数组Tire树是Tire树的升级版,Tire取自英文Retrieval中的一部分,即检索树,又称作字典树或者键树.下面简单介绍一下Tire树. 1.1 Tire树 Trie ...
- [数据结构]字典树(Tire树)
概述: Trie是个简单但实用的数据结构,是一种树形结构,是一种哈希树的变种,相邻节点间的边代表一个字符,这样树的每条分支代表一则子串,而树的叶节点则代表完整的字符串.和普通树不同的地方是,相同的字符 ...
- UVa 11732 (Tire树) "strcmp()" Anyone?
这道题也是卡了挺久的. 给出一个字符串比较的算法,有n个字符串两两比较一次,问一共会有多少次比较. 因为节点会很多,所以Tire树采用了左儿子右兄弟的表示法来节省空间. 假设两个不相等的字符串的最长公 ...
随机推荐
- redis集群同步迁移方法(二):通过redis-migrate-tool实现
前篇介绍的redis replication方法,操作步骤多,而且容易出错.在git上看到一些开源工具也能实现同步迁移功能,而且步骤简单,比如redis-port,redis-migrate-tool ...
- Mysql技术内幕(第四版)读书笔记(一)
题记:写代码已经有2年了,学到了很多知识,但是没有一个好习惯去记录,去分享,好多知识点都会忘记,所以从今天开始学着像大牛一样去记录自己经历项目的点点滴滴,先从最近读<Mysql技术内幕>开 ...
- C# ASP.NET(配置数据库 sql server 地址的两种形式以及配置信息的获取)
( 1 ) 数据库装在本机,并且采用windows认证模式 <connectionStrings> <add name="SQLConnectionString&qu ...
- Haproxy日志配置
haproxy在默认情况不会记录日志,除了在haproxy.conf中的global段指定日志的输出外,还需要配置系统日志的配置文件.下面以centos6.4为例,haproxy使用系统自带的rpm报 ...
- SQL Server 的表数据简单操作(表数据查询)
--表数据查询----数据的基本查询-- --数据简单的查询--select * | 字段名[,字段名2, ...] from 数据表名 [where 条件表达式] 例: use 商品管理数据库 go ...
- All About Python
Part one: Learn the Basics Hello, World! print "Hello,World!" Variables and Types Python i ...
- react-jsx
本文同步至微信公众号http://mp.weixin.qq.com/s?__biz=MzAxMzgwNDU3Mg==&mid=402252760&idx=1&sn=6952c4 ...
- SQL SELECT 语句
本章讲解 SELECT 和 SELECT * 语句. SQL SELECT 语句 SELECT 语句用于从表中选取数据. 结果被存储在一个结果表中(称为结果集). SQL SELECT 语法 SE ...
- Linux系统yum命令安装软件时保留(下载)rpm包 -- 转载
昨天在部署zabbix监控的时候,遇到一个问题:监控服务器处于无外网状态,在线安装不可用.而某些依赖包度娘或谷姐搜索起来也挺呛人的!于是想到一个办法,利用有外网的服务器的yum命令来安装这些软件,并自 ...
- web之css伪类
利用伪类清楚浮动: 代码: <!DOCTYPE html> <htmllang="en"> <head> <metacharset=&qu ...