蒟蒻的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 刚刚学习完最基础的网络流,需要进行这方面的练习,从简到难,有空余的话尝试学习 ...
随机推荐
- oracle数据库忘记用户名和密码莫着急
刚安装完Oracle 11g后,登录的时候没有记住用户名和密码,解决方法:新建一个用户 第一步:以系统身份登录 cmd--->sqlplus 提示输入用户名,然后输入sqlplus/as sys ...
- Mongodb 重置密码或创建用户
1.关闭mongodb 服务 win+r 输入services.msc 回车 找到MongoDB 关闭掉 2.进入到 win +r 输入cmd 进入命令窗口 在进入到mongodb 的安装目 ...
- Less——less基本安装
1.下载node.js 我们需要NodeJ运行LESS示例. 要下载NodeJ,请打开链接https://nodejs.org/en/ 2.node.js安装是否正确 在cmd中输入lessc -v, ...
- Xamarin.Forms实现touch事件
Xamarin.Forms的View没有touch事件,只能自己实现 首先,在共享项目里面,放入这几个类,结构大概是这样的: using System; using Xamarin.Forms; na ...
- 30.3 FCL中的混合构造
30.3.2 Monitor类和同步块 internal sealed class Transaction { private readonly object _lock = new object( ...
- 2 Button
// <summary> /// 设置透明按钮样式 /// </summary> private void SetBtnStyle(Button btn) { btn.Flat ...
- c++ map: 使用struct或者数组做value
Notice 如果是program中有两个map对象,可能你需要两个map iterator,但是注意两个iter object不能命名一样,可以分别为iter1, iter2 Example #in ...
- / Vijos / 题库 /1250 / 最勇敢的机器人
/ Vijos / 题库 /1250 / 最勇敢的机器人 借鉴博客:http://www.cnblogs.com/chty/p/5830516.html 背景 Wind设计了很多机器人.但是它们都认为 ...
- defer, panic, recover使用总结
1. defer : 延迟调用.多个defer,依次入栈,在函数即将退出时,依次出栈调用 package main import "fmt" func main() { defer ...
- models中字段参数blank和null的用法区别
blank当blank=True时,说明此处的数据可以不填,默认情况下为False,也就意味着默认情况下,所输入的数据不得空,blank是和页面表单有关,在页面需要输入参数的时候,如果在models里 ...