Professional Documents
Culture Documents
Lecture
Lecture
Lecture
2022-10-02
Ptz Camp 2017 Jagiellonian U Contest
Problem J. Spoonerisms
• 给定 n 个字符串,问是否存在一对 (A,B) ,使得 A 能拆成 pq,B 能
拆成 rs ,且 C=ps 和 D=rq 也在这 n 个串中出现
• n<=500000,Σ|S|<=500000
Ptz Camp 2017 Jagiellonian U Contest
Problem J. Spoonerisms
• 需要想到建图
• 用 trie 树把前缀和后缀提取出来然后同一个串的前缀和后缀之间
连边,则原题转化为找一个四元环的问题。
• 四元环问题可以在 O(n*sqrt(n)) 的时间内解决
Ptz Camp 2017 Jagiellonian U Contest
Problem J. Spoonerisms
• 这里讲一下无向图三元环 / 四元环计数问题:
• 三元环计数:把点按度数从大到小排序,同度数按编号排序
• 排序后,无向边视作有向边,序号小的向序号大的连边
• n<=50,m<=n*(n-1),q<=10^5,k<=10^4
HDU 6331 walking plan
• 考虑暴力是用 Floyd 算出走 k 步从 s 到 t 的最短路,预处理 O(kn^3) ,无法接受
• 我们考虑平衡预处理和查询两部分的复杂度:
• 考虑 k=100*q+r
• 我们预处理 g[q][s][t] 表示恰好走 q*100 步,从 s 到 t 的最短路
• 然后零散部分 r ,我们预处理 f[r][s][t] 表示走 r 步,从 s 到 t 的最短路
• dis[r][s][t] 表示走 >=r 步,从 s 到 t 的最短路
• >=r 怎么处理呢?
• 我们考虑走 n 步一定会出现一个环,那么 dis[r][s][t]=min(f[r][s][t],f[r+1][s][t],
……,f[r+n][s][t])
• 回答时候把 k 拆成两部分,然后枚举中转点 z ,答案是 min(g[q][s][z]+dis[r][z][t])
• 复杂度 O(sqrt(k)*n^3+qn)
2016 BZOJ 十连测 Claris contest day2
• 有 n 个点,编号为 1~n ,开始有 m 条单向边。每个点有一个编码
val ,如果 val[i] and val[j] = val[j] ,那么 i->j 也有一条单向边。边
权都为 1 ,求 1 号点到每一个点的距离。
• n,m,q<=200000
The 18th Zhejiang Provincial Collegiate Programming Contest D.
Shortest Path Query
• 我们先建立 Trie 树
• 对于一对询问 (s,t) ,我们取它们二进制的公共前缀
• 这对应 Trie 树上从 LCA(s,t) 到根的一条路径
• 如 101010 和 101011 ,取公共前缀之后为 10101
• 那么这条 LCA(s,t) 到根的路径为 1,10,101,1010,10101
• 可以发现, (s,t) 的最短路一定会经过这几个点其中之一,且完全
在它的子树里
The 18th Zhejiang Provincial Collegiate Programming Contest D.
Shortest Path Query