蒟蒻的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 刚刚学习完最基础的网络流,需要进行这方面的练习,从简到难,有空余的话尝试学习 ...
随机推荐
- 【转】Centos7 ftp 配置及报错处理
原文链接: https://www.cnblogs.com/GaZeon/p/5393853.html Centos7网络配置,vsftpd安装及530报错解决 今天在虚拟机安装CentOS7,准备全 ...
- Android 微信SDK图片分享(checkArgs fail, thumbData is invalid)
微信官网给的Demo中.图片的分享例子他是这么描述的: String url = "http://pic2.nipic.com/20090506/1478953_125254084_2.jp ...
- Android开发笔记(9)——初步设置Menu
转载请注明:http://www.cnblogs.com/igoslly/p/6858656.html 初步设置Menu 设置Menu,在ActionBar上添加按钮操作: 在 ...
- JS高级——缓存原理
缓存的原理 1.就是将常用的数据存储起来,提供便利,减少查询次数和所消耗的事件 2.利用作用的原理所产生的数据库:非关系型数据库(内存型数据库) MongoDB.Redis等 3.还有网站静态页面缓存 ...
- nagios插件nagiosql安装配置
nagios插件nagiosql安装配置 # Nagiosql install [root@Cagios ~]# yum install -y libssh2 libssh-devel [root@C ...
- Centos安装smokeping教程
Centos安装smokeping教程 一 .安装基本依赖包 ntpdate time.windows.com #64bit rpm -Uhv http://apt.sw.be/redhat/el6/ ...
- Git学习总结二(版本回退)
修改修改仓库中readme.txt文件,然后用git status命令看看结果: $ git status On branch master Changes not staged for commit ...
- jdbcUrl is required with driverClassName错误解决
jdbcUrl is required with driverClassName springboot2.0配置多数据源: spring.datasource.primary.url=jdbc:mys ...
- php第十三节课
查询 <?php class DBDA{ public $host = "localhost"; //数据库地址 public $uid = "root" ...
- codevs1231 最优布线问题
1231 最优布线问题 题目描述 Description 学校需要将n台计算机连接起来,不同的2台计算机之间的连接费用可能是不同的.为了节省费用,我们考虑采用间接数据传输结束,就是一台计算机可以间接地 ...