蒟蒻的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 刚刚学习完最基础的网络流,需要进行这方面的练习,从简到难,有空余的话尝试学习 ...
随机推荐
- MVC系列学习(二)-初步了解ORM框架-EF
1.新建 一个控制台项目 2.添加一个数据项 a.选择数据库 注:数据库中的表如下: b.选择EF版本 c.选择表 3.初步了解EF框架 看到了多了一个以 edmx后缀的文件 在edmx文件上,右击打 ...
- [ USACO 2018 OPEN ] Out of Sorts (Platinum)
\(\\\) \(Description\) 对一长为\(N\)的数列\(A\)排序,不保证数列元素互异: 数列\(A\)中\(A[1...i]\)的最大值不大于\(A[i+1-N]\)的最小值,我们 ...
- python--9、进程及并发知识
进程 一个文件的正在执行.运行过程就成为一个进程.执行多个程序,把程序文件都加载到内存,并且多个程序的内存空间隔离--空间上的复用. 遇到IO等待,切CPU到别的程序,提升效率.没有IO,一个程序占用 ...
- (转)Vuex简单入门
今天试了一下Vuex,感觉跟Redux的实现思想类似.再此,简单地总结一下. 什么是Vuex 在Vue中,多组件的开发给我们带来了很多的方便,但同时当项目规模变大的时候,多个组件间的数据通信和状态管理 ...
- TCP协议滑动窗口(一)——控制大批量数据传输速率
窗口大小:TCP头中一个16位的域,表示当前可用接受缓冲区大小.在每个TCP对等段连接初始化时,告诉对方自己的窗口大小(不一定是满额,假如满额65201字节,可能暂时通告5840字节).若客户端接受数 ...
- jQuery——链式编程与隐式迭代
链式编程 1.原理:return this; 2.通常情况下,只有设置操作才能把链式编程延续下去.因为获取操作的时候,会返回获取到的相应的值,无法返回 this. 3.end():结束当前链最近的一次 ...
- 史上巨坑: vim的"set foldmethod=syntax"设置竟然是导致ctrl+p(ctrl+n)补全在文件稍大时光标位于中间位置补全效率变慢的元凶!
最近我的vim又让我闹心了. 问题出现在supertab的补全速度上, 有时候按下tab键半天才弹出补全列表, 即便是弹出了列表在列表上下移动也变得的相当缓慢, 这让我的很是蛋疼. 在完全无法接受这个 ...
- NSOperationQueue和GCD的区别,以及在什么场合下使用
1> GCD是纯C语言的API .NSOperationQueue是基于GCD的OC的封装. 2> GCD只支持FIFO队列,NSOperationQueue可以方便设置执行顺序,设置最大 ...
- 1、DataGridView
DataGridView赋值后 通过RowPostPaint事件绘制行号 private void AddXh() { DataGridViewTextBoxColumn col = new Data ...
- uva253 Cube painting(UVA - 253)
题目大意 输入有三种颜色判断两个骰子是否相同 思路(借鉴) ①先用string输入那12个字符,然后for出两个骰子各自的字符串 ②这里用的算法是先找出第一个的三个面与第二个的六个面去比较,如果找到相 ...