自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(31)
  • 收藏
  • 关注

原创 Computer Virus on Planet Pandora HDU - 3695 文本串正反跑一遍AC自动机

显然我们直接让文本串正反各跑一遍AC自动机更加方便。只是问模式串在AC自动机出现次数,所以直接消去flag标记即可。#include <cstdio>#include<cstring>#include<iostream>#include<algorithm>#include<queue>using namespace std;typedef long long ll;#define re register#define l

2020-08-31 16:53:40 129

原创 病毒侵袭 HDU - 2896 AC自动机

AC自动机基础题,每个字符存一下是哪几个病毒的结尾字符。然后查询时直接存下来即可。注意每次flag要重新更新。#include <cstdio>#include<vector>#include<cstring>#include<iostream>#include<algorithm>#include<queue>using namespace std;typedef long long ll;#defi

2020-08-29 16:49:00 119

原创 P3808 【模板】AC自动机(简单版)

给定n个模式串和1个文本串,求有多少个模式串在文本串里出现过。注意:是出现过,就是出现多次只算一次。AC自动机步骤:1:处理所有模式串,建立trie树:2:处理fail[i]数组:(最长的(当前字符串的后缀))在Trie上可以查找到)的末尾编号。显然fail[i]的深度一定小于i,所以可以BFS递推fail数组。而根据fail数组的定义,对于一个点u,他的fail数组求出过了,对于他的儿子v节点(是u指向i字符的儿子),若v存在,则v的fail为:tr[fail[u]][i]若v

2020-08-29 16:24:40 205

原创 Om Nom and Necklace CodeForces - 526D KMP处理循环节 + 数学取整运算证明

题意:求每个前缀是否是ABABA 的形式。(其中A有k+1个,B有k个,AB均可为空)对于一个前缀字符串i:令S=AB则可看成:SSSSA。若满足S的个数为k,则满足题意。对于前缀字符串i:其最小循环节e长度为:i-nxt[i], 改字符串可以看做:eeeex如果若干个e拼凑成一个S,使得S的数量为k,则满足题意。最后的x和前面若干个e组成A。具体判断的话我们可以分情况:下面是官方题解#include <bits/stdc++.h>using

2020-08-28 16:38:42 188

原创 Simpsons’ Hidden Talents HDU - 2594 连接串跑KMP

问s1前缀与s2后缀最大匹配。显然拼接两个串,然后跑KMP,(中间用分隔符,防止结果大于n)#include<cstring>#include<iostream> #include<vector>using namespace std;typedef long long ll;const int M = 1e6+7;char p[M],t[M];int nxt[M];int main(){ ios::sync_with_stdio(false

2020-08-27 13:35:47 103

原创 Seek the Name, Seek the Fame POJ - 2752 KMP水题

根据nxt数组的定义,就是前缀等于后缀最大的子串长度。for一遍也行,while(nxt[tp])也行。KMP这种东西尽量每次都手敲吧,最基础的算法没必要套板子#include<cstring>#include<iostream> #include<vector>using namespace std;typedef long long ll;const int M = 1e6+7;struct KMP{ char p[M],t[M];//模

2020-08-27 13:28:25 124

原创 Power Strings POJ - 2406 最小循环节长度

如果n%(n-nxt[n])==0,那么每一段len 都是相等的(根据kmp nxt数组的含义)#include<cstring>#include<iostream> using namespace std;typedef long long ll;const int M = 1e6+7;struct KMP{ char p[M],t[M];//模式串p,文本串t,p在t中出现次数,及位置, 下标1-n int nxt[M],n,m,f[M];//...

2020-08-27 13:13:32 165

原创 P3375 【模板】KMP字符串匹配 KMP 模板

好久没做KMP/AC自动机的题了,都快忘了。 就多校HDU做了一道,还是直接套的板子。这次准备手敲KMP/AC自动机,弄熟悉一点,做点经典题目。看了5min的B站KMP视频,手敲了板子一遍过。(现在的算法理解能力比之前快多了)回顾下KMP的算法吧:首先暴力的话:枚举文本串p所有位置(长度m),每个位置用模式串匹配(长度n)。复杂度n*m。而我们发现:形如:p: abababac, t=ababa时,暴力匹配非常低效因为我们在匹配p,和t时有很多额外信息被浪费了。我们...

2020-08-27 12:50:10 226

原创 P2227 [HNOI2001]洗牌机 置换分数幂

由于n是偶数,每次洗牌相当于把当前序列平方。也就是说,gcd(k,n)==1,所以置换不会分裂。根据a1[i]=a[i*k%n];a1是置换a的k次方得到的置换。现在已知a1,求a。k=2^s;#include <bits/stdc++.h>using namespace std;typedef long long ll;#define re register#define ls (o<<1)#define rs (o<<1|1)

2020-08-26 17:50:19 235

原创 1398D - Colored Rectangles 思维+dp

刚睡醒,做点思维题活跃脑子。简单的三维DP,很容易想到从大往小取,但贪心的话,每个颜色的下一个的大小也要考虑,比较麻烦,直接DP就完事了。n<=200,复杂度n^3#include <bits/stdc++.h>using namespace std;typedef long long ll;#define re register#define ls (o<<1)#define rs (o<<1|1)#define pb push.

2020-08-25 16:09:58 160

原创 2020牛客暑期多校训练营(第二场) B Boundary 计算几何,三点确定圆心

暴力做法就是枚举两个点,再枚举其他点是否在这个圆上。但n=2000.我们可以考虑n^2的做法:枚举两个点,确定一个圆心:然后存下来每个圆心出现的次数。加入一个圆上有n个点,则圆心出现次数为:n*(n-1)/2.最后找圆心出现次数最多的圆心,再求n即可。另外:圆上三点确定圆心可以用圆的曲线方程求解,现场求太浪费时间,直接记结论就行:#include <bits/stdc++.h>using namespace std;typedef long long

2020-08-25 11:50:27 198

原创 2020牛客暑期多校训练营(第一场) E Counting Spanning Trees 论文结论题

像这种论文结论题,现场基本不可能证明出来,猜都很难猜出来,只有看过论文知道。。而对于我这种不是学有余力的人来说,记住结论就行了,这个论文就不看了。性价比太低。https://arxiv.org/pdf/0706.2918.pdf 各位大牛有兴趣可以看看https://www.cnblogs.com/LiuRunky/p/2020_Nowcoder_Multi_University_Contest_1.html直接用了这位同学的总结。(没错我太懒了,论文都没打开过)然后根据这篇..

2020-08-24 22:33:00 192

原创 P4111 [HEOI2015]小 Z 的房间 矩阵树 模板题

上面是矩阵树的知识点,证明有兴趣可以百度,我感觉不想看的话直接当定理记住就行(就像勾股定理,谁管他咋证明的,用就完事了)构造出矩阵K后,生成树个数就是:矩阵K的n-1阶主子式的值。可以把矩阵变为上三角矩阵,下三角值均为0.这样矩阵行列式的值就是对角线的乘积。而由于这题模数不为质数,所以我们不能用高斯消元的做法直接消去。但我们的目的只是把下三角清零,所以可以用辗转相除的方法来消去下三角。具体实现看代码即可:#include <bits/stdc++.h>usi...

2020-08-24 21:34:38 143

原创 2020牛客暑期多校训练营(第一场)D Quadratic Form 拉格朗日乘数法+求矩阵的逆

证明过程如下。然后求个矩阵逆,矩阵乘法一下即可。#include <bits/stdc++.h>using namespace std;typedef long long ll;#define re registerconst int M = 200+7;const int mod =998244353;ll a[M][M<<1];ll b[M],c[M];ll qpow(ll a,ll b){ ll ans=1; while(b) {

2020-08-24 17:10:42 162

原创 P4783 【模板】矩阵求逆 高斯-约旦消元 求矩阵的逆

以上是我们算法的依据下面的是例题。我们用高斯-约旦消元把分块矩阵: A|E 中的A初等变化为E , 整体矩阵变为:输入右块矩阵即可。#include <bits/stdc++.h>using namespace std;typedef long long ll;const int M = 400+7;const int mod =1e9+7;int a[M][M<<1];ll qpow(ll a,ll b){ ll ans=1; wh...

2020-08-24 17:07:57 402

原创 2020牛客暑期多校训练营(第一场)B Infinite Tree 虚树

https://blog.csdn.net/weixin_37517391/article/details/82744605这里学习了虚树的建立。https://blog.csdn.net/weixin_44282912/article/details/107346986然后看了这篇blog,做出了这道题。这道题如果n很小,比如n^2<=1e5,则可以直接建树,然后变成经典换根dp问题:选择一个源点,求出所有标记点到源点的距离乘标记点的点权和,最小。但这题n<=1e5,显然无

2020-08-23 19:02:29 206

原创 2020牛客暑期多校训练营(第一场) A B-Suffix Array 后缀数组

显然每个后缀只有第一次出现ab的的前面不同。要么是 ab要么是aaaaab,bbbbba要么是aaaa,bbbbO1判断,后面的部分用rank比较即可#include <bits/stdc++.h>using namespace std;typedef long long ll;const int M = 1e6+7;struct suffix_array{ int str[M],sa[M],rank[M],t1[M],t2[M],c[M]; //

2020-08-22 12:18:21 181

原创 2020 多校补题情况

牛客:第一场J:AEHIJ第二场:CDFJ第三场:ABCEFGL第四场:BFH第五场:BDEFI第六场:BCEGHK第七场:CDHhdu——

2020-08-21 18:02:08 141

原创 后缀数组 模板(结构体) DC3 与倍增

DC3#include <bits/stdc++.h>using namespace std;typedef long long ll;const int M = 1e6+7;struct suffix_array{ int str[M],sa[M],rank[M],t1[M],t2[M],c[M]; //int lg2[M];int rmq[21][M],height[M]; //sa[i],排名i(1-n)后缀的起始下标(0 - n-1) //

2020-08-21 17:50:36 23237

原创 2020 Multi-University Training Contest 10 1010 Tic-Tac-Toe-Nim NIM博弈

由于双方第一次必须取一整堆:我们可以先枚举先手选择的格子:(x1,y1)后手显然不能选择与(x1,y1)同行或者同列的格子,(否则先手直接同列或同行取胜)再枚举后手选择了(x2,y2),此时剩下的7个格子,有6个与(x1,y1)或(x2,y2)同行或同列,当任意玩家取走这六堆的最后一枚石子时,他就必败了,而最后一堆石子可以任取。这7堆石子就构成了NIM博弈,谁无石子可取,谁就必败了。枚举判断异或和即可。#include <bits/stdc++.h>using nam

2020-08-21 15:05:36 215

原创 牛客等级之题N1(8.18场) A MMSet2 树的直径合并 dfs序维护lca

证明类似树的直径。类似于我上篇博客。#include <bits/stdc++.h>using namespace std;typedef long long ll;const int M = 3e6+7;int head[M],cnt=1;struct EDGE{int to,nxt;ll w;}ee[M*2];void add(int x,int y,ll w){ee[++cnt].nxt=head[x],ee[cnt].w=w,ee[cnt].to=y,head[x]=c

2020-08-19 17:47:45 120

原创 牛客练习赛67 F牛妹的苹果树 树上直径合并/ dfs序求LCA + 倍增维护最远点对

经典问题。证明类似于树的直径。两个点集所在的联通快合并,(其中可能会有交集)。其中合并后直径(点集中最远点对)为,两个联通快的直径对应的4个点,组合的6中情况的点对最大值。(即直径一定是这4个点中的2个,证明类似树的直径,从任一点出发,所达最远点是直径点,显然这4个点任一点出发,最远点一定还是这4个点中的一个)然后用dfs序维护lca(可以做到O1),倍增维护树直径合并即可#include <bits/stdc++.h>using namespace std;typedef

2020-08-19 17:35:26 145

原创 2020 Multi-University Training Contest 7 07,09,10

AC:09,10hdu6850 1007 Game很容易想到,如果先手到达最长点对之一,则必败。(后手可以走最长点对的另一点,使得先手无处可走)对于一个游戏,把他转化为无向图。先找出当前图中最长的边d。然后把边长为d的所有边连接的点都删去(这些点称为必败点,到达即必败),然后这些点设为一层(称为必败层,即先手到这一层必败)然后得到新的无向图。重复上述操作。直到图只剩一个点,或者为空,最后的一个点设为一层。显然这是一个分层图,只能由底层走向高层,且先跨层的人必败。而且每层.

2020-08-12 18:27:59 239

原创 letcode 专题

136. 只出现一次的数字给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。异或和来判断。class Solution {public: int singleNumber(vector<int>& nums) { int ans=0; for(auto x:nums){ ans^=x; } return ans; ...

2020-08-08 14:13:42 506

原创 2020 Multi-University Training Contest 5 1001,1003,1009

316 team0691 北京林业大学 3 09:56:39 1001 Tetrahedron由体积相同可以化成:然后枚举求期望,线性求逆元即可。#include <bits/stdc++.h>using namespace std;typedef long long ll;#define ls (o<<1)#define rs (o<<1|1)#define pb push_backconst double P.

2020-08-04 21:28:20 126

原创 平衡树(splay)模板,包含常规6大操作以及区间翻转

P3391【模板】文艺平衡树P3369 【模板】普通平衡树已经测试过上述题目(而且性能较好),可放心食用~~#include <bits/stdc++.h>using namespace std;const int N = 100005;int n;struct Splay { int rt, tot, fa[N], ch[N][2], val[N], cnt[N], sz[N]; //sz[x]:x节点子树的大小;cnt[x]:与x节点权值相同的数的个数;v...

2020-08-03 23:10:21 252

原创 P3391 【模板】文艺平衡树 区间翻转更新+查询操作 splay

这是线段树无法取代splay的地方。#include<bits/stdc++.h>using namespace std;const int N=101000;int ch[N][2];int size[N],rev[N],fa[N];//rev[x],x节点是否需要左右子树互换 int n,m,rt=0;int read(){ int x=0,f=1;char ch=getchar(); while (ch<'0' || ch>'9'){if (c

2020-08-03 22:51:11 143

原创 2020牛客暑期多校训练营(第八场)GIK

G:#include <bits/stdc++.h>using namespace std;typedef long long ll;#define ls (o<<1)#define rs (o<<1|1)#define pb push_backconst double PI= acos(-1.0);const int M = 1e3+7; char s[M];struct node{ int a[5];}p[M];unordered

2020-08-03 21:55:54 240

原创 P3369 【模板】普通平衡树 平衡树模板

过了一遍平衡树,把代码进行了标注,方便以后回顾。学平衡树主要为了处理区间翻转问题,和LCT(今天牛客多校考到了。。先回顾一下前置芝士)#include <bits/stdc++.h>const int N = 100005;struct Splay { int rt, tot, fa[N], ch[N][2], val[N], cnt[N], sz[N]; //sz[x]:x节点子树的大小;cnt[x]:与x节点权值相同的数的个数;val[x]:x节点的权值 inlin

2020-08-03 21:49:13 345

原创 2020牛客暑期多校训练营(第七场) BDH

B:n*m个口罩分成最少的组使得可以这样分配:n个医院,每个医院m个口罩。m个医院,每个医院n个口罩。为了使得数量最少,每组的口罩尽可能要大。假设n<mn个医院,每个医院m个口罩,我们最多可以让 m/n*m组有n个口罩(当前最大值)。然后问题转化为了:n个医院每个医院需要m%n个口罩m%n个医院,每个医院需要n个口罩。变化为了子问题,dfs下去即可。#include <bits/stdc++.h>using namespace std;.

2020-08-02 21:39:57 183

原创 牛客编程巅峰赛S1第8场 - 王者 ABC

A:枚举前两位,等差数列就确定了#include <bits/stdc++.h>using namespace std;typedef long long ll;#define ls (o<<1)#define rs (o<<1|1)#define pb push_backconst double PI= acos(-1.0);const int M = 1e5+7;/*int head[M],cnt=1;void init(){cnt=1,me

2020-08-01 22:48:03 183

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除