蒟蒻的trie树专题
POJ 3630 Phone List: 模板
///meek #include<bits/stdc++.h>
using namespace std; using namespace std ;
typedef long long ll;
#define mem(a) memset(a,0,sizeof(a))
#define pb push_back
inline ll read()
{
ll x=,f=;char ch=getchar();
while(ch<''||ch>''){
if(ch=='-')f=-;ch=getchar();
}
while(ch>=''&&ch<=''){
x=x*+ch-'';ch=getchar();
}return x*f;
}
//****************************************
const int N=+;
#define mod 10000007 #define inf 10000007
#define maxn 10000 char a[N];
struct Trie {
int ch[N][],sum[N];
int siz;
Trie() { siz=;
mem(ch);mem(sum);
}
int idx(char c) {return c-'a';}
void insertt(char *s) {
int u=,n=strlen(s);
for(int i=;i<n;i++) {
int c=idx(s[i]);
if(!ch[u][c]) {
ch[u][c]=siz++;
}
u=ch[u][c];sum[u]++;
}
}
int ask(char *s) {
int u=,n=strlen(s);
for(int i=;i<n;i++) {
int c=idx(s[i]);
if(ch[u][c]) u=ch[u][c];
else return ;
}
return sum[u];
}
}trie;
int main() {
while(gets(a)) {
if(strlen(a)==)break;
trie.insertt(a);
}
while(scanf("%s",a)!=EOF) {
cout<<trie.ask(a)<<endl;
}
return ;
}
POJ3630
HDU 1004 Let the Balloon Rise:模板
///meek #include<iostream>
#include<cstdio>
#include<cstring>
using namespace std; using namespace std ;
typedef long long ll;
#define mem(a) memset(a,0,sizeof(a))
#define pb push_back
inline ll read()
{
ll x=,f=;char ch=getchar();
while(ch<''||ch>''){
if(ch=='-')f=-;ch=getchar();
}
while(ch>=''&&ch<=''){
x=x*+ch-'';ch=getchar();
}return x*f;
}
//****************************************
const int N=+;
#define mod 10000007 #define inf 10000007
#define maxn 10000 struct Trie{
int ch[N][],sum[N],siz=,W=,ansi,ans;
void init() {mem(ch),mem(sum),siz=;W=,ansi=;ans=-;}
int idx(char c) {return c-'a';}
void insertt(char *s) {
int u=,n=strlen(s);
W++;
for(int i=;i<n;i++) {
int c=idx(s[i]);
if(!ch[u][c]) {
ch[u][c]=siz++;
}
u=ch[u][c],sum[u]++;
if(ans<sum[u]&&i==n-) {ans=sum[u];ansi=W;}
}
}
}trie;
int main() {
char a[N][];int n;
while(scanf("%d",&n)&&n) {
trie.init();
for(int i=;i<=n;i++) {
scanf("%s",a[i]);
trie.insertt(a[i]);
}
cout<<a[trie.ansi]<<endl;
}
return ;
}
HDU1004
HDU 1251统计难题 :查找前缀个数
///meek #include<bits/stdc++.h>
using namespace std; using namespace std ;
typedef long long ll;
#define mem(a) memset(a,0,sizeof(a))
#define pb push_back
inline ll read()
{
ll x=,f=;char ch=getchar();
while(ch<''||ch>''){
if(ch=='-')f=-;ch=getchar();
}
while(ch>=''&&ch<=''){
x=x*+ch-'';ch=getchar();
}return x*f;
}
//****************************************
const int N=+;
#define mod 10000007 #define inf 10000007
#define maxn 10000 char a[N];
struct Trie {
int ch[N][],sum[N];
int siz;
Trie() { siz=;
mem(ch);mem(sum);
}
int idx(char c) {return c-'a';}
void insertt(char *s) {
int u=,n=strlen(s);
for(int i=;i<n;i++) {
int c=idx(s[i]);
if(!ch[u][c]) {
ch[u][c]=siz++;
}
u=ch[u][c];sum[u]++;
}
}
int ask(char *s) {
int u=,n=strlen(s);
for(int i=;i<n;i++) {
int c=idx(s[i]);
if(ch[u][c]) u=ch[u][c];
else return ;
}
return sum[u];
}
}trie;
int main() {
while(gets(a)) {
if(strlen(a)==)break;
trie.insertt(a);
}
while(scanf("%s",a)!=EOF) {
cout<<trie.ask(a)<<endl;
}
return ;
}
HDU1251
HDU 4825 Xor Sum : 给你n个数m个询问,每隔询问一个A,问你这n个数中与A异或值最大是多少,
将树转化成01 串的trie树,经典题型
///meek #include<iostream>
#include<cstdio>
#include<cstring>
using namespace std; using namespace std ;
typedef long long ll;
#define mem(a) memset(a,0,sizeof(a))
#define pb push_back
inline ll read()
{
ll x=,f=;char ch=getchar();
while(ch<''||ch>''){
if(ch=='-')f=-;ch=getchar();
}
while(ch>=''&&ch<=''){
x=x*+ch-'';ch=getchar();
}return x*f;
}
//****************************************
const int N=+;
#define mod 10000007 #define inf 10000007
#define maxn 10000 struct Trie{
int ch[N][],sum[N],siz=,ans,W;
void init(){mem(sum),mem(ch),siz=;}
void insertt(int x) {
int tmp=x;
int each[],k=;mem(each);
while(x) {
each[k++]=x%;
x/=;
}int u=;
for(int i=;i>=;i--) {
int c=each[i];
if(!ch[u][c]){
ch[u][c]=siz++;
}
u=ch[u][c];if(i==)sum[u]=tmp;
}
}
int ask(int x) {
int u=;int tmp=x;
int each[],k=;mem(each);
while(x) {
each[k++]=x%;
x/=;
}
for(int i=;i>=;i--) {
int g,c=each[i];if(c==)g=;else g=;
if(ch[u][g]) {
u=ch[u][g];
}
else u=ch[u][c];
if(i==) return sum[u];
}
}
}trie;
int main() { int T=read(),n,m,z[N];
int oo=;
while(T--) {int a[N];
trie.init();
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++) {
scanf("%d",&a[i]);
trie.insertt(a[i]);
}
for(int i=;i<=m;i++) {
scanf("%d",&z[i]);
} printf("Case #%d:\n",oo++);
for(int i=;i<=m;i++) {
cout<<trie.ask(z[i])<<endl;
}
}
return ;
}
HDU 4825
POJ 3764 The xor-longest Path:
题意:给你一个树,及n-1条边权,问你任意一条路径上最大异或边权值是多少
题解: 我们根据异或性质,对于u->v这条路径上异或值可以转化为 XOR(0->v)^XOR(0->u)
我们先dfs出根节点到任意节点的路径异或值,于是转化成任意两个数的 异或最大值了
///meek #include<iostream>
#include<cstdio>
#include<cstring>
using namespace std; using namespace std ;
typedef long long ll;
#define mem(a) memset(a,0,sizeof(a))
#define pb push_back
inline ll read()
{
ll x=,f=;char ch=getchar();
while(ch<''||ch>''){
if(ch=='-')f=-;ch=getchar();
}
while(ch>=''&&ch<=''){
x=x*+ch-'';ch=getchar();
}return x*f;
}
//****************************************
const int N=+;
#define mod 10000007 #define inf 10000007
#define maxn 10000 int a[N],head[N],t,n;
struct ss {
int to,next,va;
}e[N*];
void init() {mem(head),t=;}
void add(int u,int v,int w) {e[t].to=v;e[t].va=w;e[t].next=head[u];head[u]=t++;}
void dfs(int x,int pre) {
for(int i=head[x];i;i=e[i].next) {
if(e[i].to==pre) continue;
a[e[i].to]=e[i].va^a[x];
dfs(e[i].to,x);
}
}
struct Trie{
int ch[N][],sum[N],siz,ans,W;
void init(){mem(sum),mem(ch),siz=;}
void insertt(int x) {
int tmp=x;
int each[],k=;mem(each);
while(x) {
each[k++]=x%;
x/=;
}int u=;
for(int i=;i>=;i--) {
int c=each[i];
if(!ch[u][c]){
ch[u][c]=siz++;
}
u=ch[u][c];if(i==)sum[u]=tmp;
}
}
int ask(int x) {
int u=;int tmp=x;
int each[],k=;mem(each);
while(x) {
each[k++]=x%;
x/=;
}
for(int i=;i>=;i--) {
int g,c=each[i];if(c==)g=;else g=;
if(ch[u][g]) {
u=ch[u][g];
}
else u=ch[u][c];
if(i==) return sum[u];
}
}
}trie;
int main() { while(scanf("%d",&n)!=EOF) {
int u,v,w;init();
trie.init();
for(int i=;i<n;i++) {
scanf("%d%d%d",&u,&v,&w);
add(u,v,w),add(v,u,w);
}
memset(a,,sizeof(a));
dfs(,-);
for(int i=;i<n;i++) {
trie.insertt(a[i]);
}
int ans=;
for(int i=;i<n;i++) {
ans=max(ans,a[i]^trie.ask(a[i]));
}
cout<<ans<<endl;
}
return ;
}
POJ 3764
蒟蒻的trie树专题的更多相关文章
- 蒟蒻浅谈树链剖分之一——两个dfs操作
树链剖分,顾名思义就是将树形的结构剖分成链,我们以此便于在链上操作 首先我们需要明白在树链剖分中的一些概念 重儿子:某节点所有儿子中子树最多的儿子 重链:有重儿子构成的链 dfs序:按重儿子优先遍历时 ...
- 蒟蒻的数位DP专题总结
BZOJ 1026: [SCOI2009]windy数: 题目链接: http://www.lydsy.com/JudgeOnline/problem.php?id=1026 d ...
- 【BZOJ-4636】蒟蒻的数列 动态开点线段树 ||(离散化) + 标记永久化
4636: 蒟蒻的数列 Time Limit: 30 Sec Memory Limit: 256 MBSubmit: 247 Solved: 113[Submit][Status][Discuss ...
- BZOJ_4636_蒟蒻的数列_线段树+动态开点
BZOJ_4636_蒟蒻的数列_线段树+动态开点 Description 蒟蒻DCrusher不仅喜欢玩扑克,还喜欢研究数列 题目描述 DCrusher有一个数列,初始值均为0,他进行N次操作,每次将 ...
- 【bzoj4636】蒟蒻的数列 离散化+线段树
原文地址:http://www.cnblogs.com/GXZlegend/p/6801379.html 题目描述 蒟蒻DCrusher不仅喜欢玩扑克,还喜欢研究数列 题目描述 DCrusher有一个 ...
- [bzoj4636]蒟蒻的数列_线段树
蒟蒻的数列 bzoj-4636 题目大意:给定一个序列,初始均为0.n次操作:每次讲一段区间中小于k的数都变成k.操作的最后询问全局和. 注释:$1\le n\le 4\cdot 10^4$. 想法: ...
- 并不对劲的字符串专题(三):Trie树
据说这些并不对劲的内容是<信息学奥赛一本通提高篇>的配套练习. 并不会讲Trie树. 1.poj1056-> 模板题. 2.bzoj1212-> 设dp[i]表示T长度为i的前 ...
- 洛谷P2412 查单词 [trie树 RMQ]
题目背景 滚粗了的HansBug在收拾旧英语书,然而他发现了什么奇妙的东西. 题目描述 udp2.T3如果遇到相同的字符串,输出后面的 蒟蒻HansBug在一本英语书里面找到了一个单词表,包含N个单词 ...
- 【蒟蒻の进阶PLAN】 置顶+持续连载
看到周围神犇们纷纷列计划,本蒟蒻也决定跟随他们的步伐,计划大约是周计划吧,具体怎么安排我也不确定.. 2015.12.30 刚刚学习完最基础的网络流,需要进行这方面的练习,从简到难,有空余的话尝试学习 ...
随机推荐
- C#学习-图片的处理
1.在图片上加防伪标记 private void btnAddString_Click(object sender, EventArgs e) { //以流的方式,获取一张图片 using (File ...
- fcc html5 css 练习3
行内样式看起来是这样的 <h1 style="color: green"> .pink-text { color: pink !important; } ...
- Perforce 的基本使用教程
一.简介 P4是什么 二.基本使用方法 1.下载代码 下载最新代码 Get Latest Revision 下载指定commit代码 Get Revision 2. 检出代码 选择指定目录,右键 Ch ...
- java攻城狮之路--复习xml&dom_pull编程续
本章节我们要学习XML三种解析方式: 1.JAXP DOM 解析2.JAXP SAX 解析3.XML PULL 进行 STAX 解析 XML 技术主要企业应用1.存储和传输数据 2.作为框架的配置文件 ...
- 【译】x86程序员手册12-4.2系统指令
4.2 Systems Instructions 系统指令 Systems instructions deal with such functions as: 系统指令具有以下功能: Verifica ...
- C#使用Win32函数的一些类型转换
C#在访问Win 32 Api时需要处理C 结构与C#结构的映射,这在MSDN以及许多Blog上都可以找到参考的资料.Win 32 中有一些定义复杂的Struct,这些结构体拥有长度固定的数组或者一些 ...
- HDU_2203_KMP入门
亲和串 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...
- Java程序员怎么不断进阶 必须要掌握哪些技能
Java程序员怎么不断进阶?必须要掌握哪些技能?成为架构师是Java程序员职业规划中的重要一环,但如何才能快速实现进阶困扰了许多Java程序员.无论是从技能深度还是实战经验,架构师都远超于普通的Jav ...
- typeof和instanceof的区别
typeof和instanceof的区别: typeof typeof 是一个一元运算,放在一个运算数之前,运算数可以是任意类型.它返回值是一个字符串,该字符串说明运算数的类型.typeof 一般只能 ...
- JS数组reduce()方法
1.语法 arr.reduce(callback,[initialValue]) reduce 为数组中的每一个元素依次执行回调函数,不包括数组中被删除或从未被赋值的元素,接受四个参数:初始值(或者上 ...