142. 前缀统计

给定N个字符串S1,S2…SN,接下来进行M次询问,每次询问给定一个字符串T,求S1~SN中有多少个字符串是T的前缀。

输入字符串的总长度不超过106,仅包含小写字母。

输入格式

第一行输入两个整数N,M。

接下来N行每行输入一个字符串Si。

接下来M行每行一个字符串T用以询问。

输出格式

对于每个询问,输出一个整数表示答案。

每个答案占一行。

输入样例:

3 2

ab

bc

abc

abc

efg

输出样例:

2

0

#include <iostream>

using namespace std;

const int N = 1000010, M = 500000; //trie 的长度

int n, m;
int son[M][26], cnt[N], idx; //cnt记录该节点是多少个字符串的末尾节点 idx 虚拟内存的指针(当前用到的数组的地址,当前节点的下标)
char str[N]; int query() //查询 字符串前缀个数
{
int p = 0, res = 0; //res 表示当前路径所有单词的总和
for(int i = 0; str[i]; i++)
{
int &s = son[p][str[i] - 'a'];
if(!s) break; //当前节点为空 没有下面的路径 break
p = s;
res += cnt[p]; //加上以当前节点为结尾的个数
}
return res;
} void insert() //插入
{
int p = 0; //trie根节点 0号节点
for(int i = 0; str[i]; i++)
{
int &s = son[p][str[i] - 'a']; //当前儿子
if(!s) s = ++ idx; //s 不存在 分配一个新的值
p = s;
}
cnt[p] ++; //有一个单词以p节点为结尾 加1
} int main()
{
scanf("%d%d", &n, &m); //输入规模大于100万用scanf() while(n --)
{
scanf("%s", str);
insert();
} while(m --)
{
scanf("%s", str);
printf("%d\n", query());
}
return 0;
}

143. 最大异或对

在给定的N个整数A1,A2……AN中选出两个进行xor(异或)运算,得到的结果最大是多少?

输入格式

第一行输入一个整数N。

第二行输入N个整数A1~AN。

输出格式

输出一个整数表示答案。

数据范围

1≤N≤105,

0≤Ai<231

输入样例:

3

1 2 3

输出样例:

3

#include <iostream>
#include <algorithm> using namespace std; const int N = 100010, M = 3000000; //M节点个数 int n;
int son[M][2],idx;
int a[N]; void insert(int x)
{
int p = 0;
for(int i = 30; ~i; i--) //i >= 0 等价于 ~i
{
int &s = son[p][x >> i & 1]; //取出二进制第i位 看第i位是0还是1
if(!s) s = ++ idx; //创建新节点
p = s;
}
} int query(int x)
{
int res = 0, p = 0;
for(int i = 30; ~i; i--)
{
int s = x >> i & 1;
if(son[p][!s]) //查看不一样的分支是否存在 1看0 0看1
{
res += 1 << i; //当前位对res所做出的贡献
p = son[p][!s];
}
else p = son[p][s];
}
return res;
} int main()
{
cin >> n;
for(int i = 0; i < n; i++)
{
cin >> a[i];
insert(a[i]);
}
int res = 0;
for(int i = 0; i < n; i++) res = max(res, query(a[i])); //query 找到和当前异或最大的结果 cout << res << endl;
return 0;
}

144. 最长异或值路径

给定一个树,树上的边都具有权值。

树中一条路径的异或长度被定义为路径上所有边的权值的异或和:



⊕ 为异或符号。

给定上述的具有n个节点的树,你能找到异或长度最大的路径吗?

输入格式

第一行包含整数n,表示树的节点数目。

接下来n-1行,每行包括三个整数u,v,w,表示节点u和节点v之间有一条边权重为w。

输出格式

输出一个整数,表示异或长度最大的路径的最大异或和。

数据范围

1≤n≤100000,

0≤u,v<n,

0≤w<231

输入样例:

4

0 1 3

1 2 4

1 3 6

输出样例:

7

样例解释

样例中最长异或值路径应为0->1->2,值为7 (=3 ⊕ 4)

#include <iostream>
#include <algorithm>
#include <cstring> using namespace std; const int N = 100010, M = 3000000; //M节点个数 int n;
int h[N], e[N * 2], c[N * 2], ne[N * 2], cnt; //树:数组模拟邻接表来存,e无向图,边数*2,c是边权,ne存next指针,cnt内存,当前位下标
int son[M][2],idx;
int a[N]; void add(int u, int v, int w) //把u,v加到图里面去
{
e[cnt] = v, c[cnt] = w, ne[cnt] = h[u], h[u] = cnt ++; //数组模拟邻接表
} void dfs(int u, int father, int sum)
{
a[u] =sum;
for(int i = h[u]; ~i; i = ne[i]) //遍历u这一点的所有儿子
{
int j = e[i]; //j表示儿子
if( j != father) //这条边的出边不是往上走的
dfs(j, u, sum ^ c[i]);
}
} void insert(int x)
{
int p = 0;
for(int i = 30; ~i; i--) //i >= 0 等价于 ~i
{
int &s = son[p][x >> i & 1]; //取出二进制第i位 看第i位是0还是1
if(!s) s = ++ idx; //创建新节点
p = s;
}
} int query(int x)
{
int res = 0, p = 0;
for(int i = 30; ~i; i--)
{
int s = x >> i & 1;
if(son[p][!s]) //查看不一样的分支是否存在 1看0 0看1
{
res += 1 << i; //当前位对res所做出的贡献
p = son[p][!s];
}
else p = son[p][s];
}
return res;
} int main()
{
cin >> n;
memset(h, -1, sizeof h); //初始化邻接表表头
for(int i = 0; i < n - 1; i++)
{
int u, v, w;
cin >> u >> v >> w;
add(u, v, w);
add(v, u, w); //无向图 加两条边
} dfs(0, -1, 0); //从根节点0开始,-1 无向图遍历常用方式 出边等于父节点 不回溯 ,sum 开始为 0 for(int i = 0; i < n; i++) insert(a[i]); //根节点到i的路径所有边权的xor值 int res = 0;
for(int i = 0; i < n; i++) res = max(res, query(a[i])); //query 找到和当前异或最大的结果 cout << res << endl;
return 0;
}

《算法竞赛进阶指南》1.6Trie的更多相关文章

  1. 《算法竞赛进阶指南》0x10 基本数据结构 Hash

    Hash的基本知识 字符串hash算法将字符串看成p进制数字,再将结果mod q例如:abcabcdefg 将字母转换位数字(1231234567)=(1*p9+2*p8+3*p7+1*p6+2*p5 ...

  2. 《算法竞赛进阶指南》1.4Hash

    137. 雪花雪花雪花 有N片雪花,每片雪花由六个角组成,每个角都有长度. 第i片雪花六个角的长度从某个角开始顺时针依次记为ai,1,ai,2,-,ai,6. 因为雪花的形状是封闭的环形,所以从任何一 ...

  3. bzoj 1787 && bzoj 1832: [Ahoi2008]Meet 紧急集合(倍增LCA)算法竞赛进阶指南

    题目描述 原题连接 Y岛风景美丽宜人,气候温和,物产丰富. Y岛上有N个城市(编号\(1,2,-,N\)),有\(N-1\)条城市间的道路连接着它们. 每一条道路都连接某两个城市. 幸运的是,小可可通 ...

  4. POJ1639 算法竞赛进阶指南 野餐规划

    题目描述 原题链接 一群小丑演员,以其出色的柔术表演,可以无限量的钻进同一辆汽车中,而闻名世界. 现在他们想要去公园玩耍,但是他们的经费非常紧缺. 他们将乘车前往公园,为了减少花费,他们决定选择一种合 ...

  5. 算法竞赛进阶指南 0x00 基本算法

    放在原来这个地方不太方便,影响阅读体验.为了读者能更好的刷题,另起一篇随笔. 0x00 基本算法 0x01 位运算 [题目][64位整数乘法] 知识点:快速幂思想的灵活运用 [题目][最短Hamilt ...

  6. 算法竞赛进阶指南--快速幂,求a^b mod p

    // 快速幂,求a^b mod p int power(int a, int b, int p) { int ans = 1; for (; b; b >>= 1) { if (b &am ...

  7. 算法竞赛进阶指南0x14 Hash

    组成部分: 哈希函数: 链表 AcWing137. 雪花雪花雪花 因为所需要数据量过于大,所以只能以O(n)的复杂度. 所以不可能在实现的过程中一一顺时针逆时针进行比较,所以采用一种合适的数据结构. ...

  8. 《算法竞赛进阶指南》 1 (P4) a^b 快速幂

    快速幂 #include<cstdio> #include<cmath> #include<iostream> using namespace std; long ...

  9. POJ1722 算法竞赛进阶指南 SUBSTRACT减操作

    原题连接 题目描述 给定一个整数数组\(a_1,a_2,-,a_n\). 定义数组第 i 位上的减操作:把\(a_i\)和\(a_{i+1}\)换成\(a_i - a_{i+1}\). 用con(a, ...

随机推荐

  1. ASI和AFN实现POST异步请求的相同功能的代码

    I'm a newbie in obj-c and have been using asihttp for some of my projects. When doing a post request ...

  2. System V IPC相关函数

    System V IPC 将一个已保存的路径名和一个整数标识符转换成一个key_t值,称为IPC键key_t:System V IPC(System V消息队列.System V信号量.System ...

  3. 李洪强iOS开发之 - enum与typedef enum的用法

    李洪强iOS开发之 - enum与typedef enum的用法 01 - 定义枚举类型 上面我们就在ViewController.h定义了一个枚举类型,枚举类型的值默认是连续的自然数,例如例子中的T ...

  4. VC断点失败的原因之中的一个

    VC断点失败的原因之中的一个 flyfish 2014-10-23 情景 再debug状态下仅仅有一个cpp文件.命中不了断点. 提示 能够 同意源码与原始版本号不同 不採用,防止出现未知的隐患 问题 ...

  5. Drupal 7模板(主题钩子)的建议

    这一块的内容很多其它的讲的是样例.所以这里请直接稳步官方站点查看吧.链接 https://drupal.org/node/1089656

  6. PHP获取类名及所有函数名

    PHP获取当前类名.方法名  __CLASS__ 获取当前类名  __FUNCTION__ 当前函数名(confirm)  __METHOD__ 当前方法名 (bankcard::confirm) _ ...

  7. i MySQL 查看约束,添加约束,删除约束

    查看表的字段信息:desc 表名; 查看表的所有信息:show create table 表名; 添加主键约束:alter table 表名 add constraint 主键 (形如:PK_表名) ...

  8. 关于树论【动态树问题(LCT)】

    搬运:看一道caioj1439 题目描述 一开始给你一棵n个点n-1条边的树,每个点有一个权值wi. 三种操作: op=1 u v :在点u和点v之间建一条边. op=2 u v:摧毁点u到点v之间的 ...

  9. linux初级学习笔记八:linux权限管理及权限管理命令详解!(视频序号:04_2)

    本节学习的命令:chown,chgrp,chmod,openssl,umask 本节学习的技能: 文件权限详解及对其的操作 生成随机密码命令 用遮罩码对用户权限进行修改 站在用户登陆的角度来说SHEL ...

  10. [Selenium] 操作浏览器 Cookies

    WebDriver 提供了一系列 Cookies 的操作来获取.填写.删除 Cookies 的方法,节省了多次在登陆页面的查找元素并填写登录信息的时间. 1)获取 Cookies ,并保存到文件中以备 ...