自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 POJ 3415 Common Substrings

题意:找到两个字符串所有长度大于k的公共子串个数。题解:我们需要用到后缀数组,我们已经知道一个字符串的所有子串都是这个字符串所有后缀的前缀,所以我们这题只需要枚举A串的所有后缀对B串每个后缀的贡献。举个例子:如果A串为:abab,B串为abb。我们算A串一个后缀 – ab 的贡献需要与B串每个后缀算公共前缀的长度。这样复杂度是过不去的,所以我们需要优化。我们知道height数组可以将这些后缀都分组,我们需要知道一个性质,如果已知一些后缀是一组,那么height数组大小的变化规律一定是 小 -> 大

2020-11-14 13:32:20 158 1

原创 G - Tray Bien 状压dp(轮廓线dp)

G - Tray Bien题意:给你m * 3的矩形范围内,有一些格子是坏掉的,求用11和12来填满这个矩形的方案数。题解:dp[i][s] 代表第i列,状态为s的方案数。用1代表被填,0代表没有被填。dp[i][s]由dp[i-1][t] 转移而来,因为本题固定三行,所以状态总数为8。然后理解如何转移s1 s20 00 11 1设s1为之前状态,s2为现在状态。如果你发现当前状态此位为0,之前的状态此位也为0,那么现在的状态肯定不合法,因为我们需要填满之前的所有格子。s

2020-10-20 16:23:21 156

原创 2020-08-31

Permutation Counting题解:设dp方程:dp[i][j]代表1-i的置换满足b数组要求结尾数字为j的方案数。起始 dp[1][1] = 1;将 1 ~ i - 1 中的 j 置换出来到最后一个位置,且将 1 ~ i - 1 个位置中 插入一个数 i . 且依然符合b数组对排列的限制.解决方法:将前 1 ~ i - 1 个数中的 >= j 的数统统 + 1 . 这样使得 i - 1 => i . 空出来一个j.且限制不变。所以转移具体看代码,自己写也能写出来的。有一

2020-08-31 18:36:41 119

原创 hdu 6863 Isomorphic Strings

Isomorphic Strings题解:暴力枚举n的所有因子,判断是否合法。判断合法第一步:判断每段中各字符出现次数是否相同,第二部:判断每段的最小表示是否相同。因子还可以减枝。#include<bits/stdc++.h>using namespace std;const int maxn = 5e6+10;char s[maxn];int sum[maxn][26];int ls[26];char xka[maxn];int getmin(int st,int ed){

2020-08-14 13:12:31 155

原创 Finding a MEX 分块

Finding a MEX题意:给你一张图,每个点有点权,有q次询问,每次询问有两种操作,第一个操作就是修改一个点的点权,第二个操作就是寻找这个点周围的所有点组成集合的mex(代表0-inf中未出现的数)。题解:分块+set or 二分+线段树本题我用set,用set维护大于1000的点。其他的小点就是直接暴力。#include<bits/stdc++.h>using namespace std;const int maxn = 1e5+10;vector<int> G

2020-07-29 20:12:14 145

原创 String Distance DP

String Distance题意:给定a,b两个串,q次询问,你可以有两种操作,每次操作可以对a串或者b串在任意位置添加一个字符,或者删除一个字符。使得al - ar 与 b 串匹配。题解:设dp[i][j],代表b串第i个字符与a串 ( l-r ) 的LCS的长度为j的最短前缀长度。我们需要预处理next[i][j]代表字符j在i+1 - n中最早出现的位置。那么dp[i][j] = min(dp[i][j],dp[i-1][j]) ; dp[i][j] = min(dp[i][j],next[dp

2020-07-29 14:30:00 148

原创 2020牛客多校第二场 A , J 题

J题Just Shuffle题意:已知置换 e = {1,2,…,n } 变换k次后得到一个置换a(已知),求置换e变换一次得到的置换x。题解:这题我们能想到,对于变换规则,会存在一些环,意味着变换环的大小后置换不变。我们针对每个环考虑,设环的大小为len,变换一次的状态等价于变换 len * y + 1 次,那我们从已知考虑,已知变换k次后的状态,那么我们就能推出变换 2 * k ,3 * k,4 * k , … , 次后的状态( 我们将变换k次当成一单位次的变换 )。那我们猜想如果 x *

2020-07-14 15:32:43 278

原创 dfs序 + 可持久化字典树

Query on A Tree题意:有一颗树,有n个节点,每个节点都有权值,有q次询问,每次询问以u为根的子树节点权值中异或x结果最大的值。题解:首先解决u为根子树节点的问题,直接dfs序,解决异或,用字典树,但是同时用的话,就需要用可持久化字典树,其实就是前缀树。这题学习到一波可持久化字典树。#include <iostream>#include <string.h>#include <algorithm>#include <stdio.h>

2020-07-02 16:48:58 106

原创 字典树+manacher

Finding Palindromes这是一道字符串的综合题。题意:给你n个字符串,求能够拼接成多少个回文串。(拼接定义:a + b or b + a)。题解:对于字符串a,如果有字符串x的倒序与a的前缀匹配,那么它们必然能够组成回文串。同时还有如果a是字符串x的倒序后缀,如果字符串的前缀是回文串,那么也必然能拼接成回文串。举个例子: ab ba a abaa对于字符串 ab 来说 , 它与字符串 ba 的倒序 ab 的前缀匹配了,那么它们必然能够拼接成回文串, 还有的另一种情况就是,

2020-06-30 23:33:54 132

原创 sum of digits

G URAL 1658题意:构造一个数x,使得这个数的数位之和等于n,每个数位的平方和等于m,求最小的 x 。题解:设dp[i][j] 代表构造的数的数位之和为n,数位的平方和为j的最短长度。同时用pre[i][j]记录构造的数的首位。#include<iostream>using namespace std;int dp[910][8200];int pre[910][8200];void init(){ for(int i=0;i<=900;i++) f

2020-06-28 16:24:49 540

原创 扩展kmp的应用 Best Reward

Best Reward题意:给定一个长度为n的字符串,问你能否将这个字符串分成两个字符串,如果分成的字符串是回文子串,那么就会有价值,求分成两个串的最大价值。题解:学习到一手扩展kmp预处理后,o(1)就能判断分成的两个串是否为回文子串。s1为原串,s2为s1翻转之后的串,然后你对s2求s1的ex数组,对s1求s2的ex数组。然后再根据ex数组的定义,手推一下如何判断分成的两个串是否是回文串,具体可以看代码。#include <iostream>#include <string.h

2020-06-22 14:46:26 125

原创 kmp+最大最小表示

String Problem题意:你可以让长度为n的字符向左移动n次构成n个字符串,问你找到最小字典序和这个字符串出现的次数,和最大字典序字符串和这个字符串出现的次数。题解:出现次数应该都知道是最小循环节的个数。关键如何找到最小字典序和最大字典序。网上可以搜到最大最小表示的讲解和代码,设p1= 0, p2 = 0,k = 0;如果s[p1]和s[p2]不相等了,那么p1或p2就会跳,假设p1跳到p1+k+1的位置,意味着s[p1 – p1+k]不会是最小字典序字符串的前缀。举个例子:b b c

2020-06-19 18:16:44 120

原创 扩展kmp

网上有详细讲解,我个人觉得kmp比扩展kmp要难看的,扩展kmp主要用来解决主串的所有后缀与子串t最长的公共前缀问题,扩展kmp也能找到子串在主串中是否出现,因为如果长度为子串t的长度,那么肯定就能说明子串t在主串中出现过。借鉴了博客Corporate Identity这道题的做法,顺便学习了一下扩展kmp,其实这道题暴力也能过的,只不过好麻烦,字符串题码力就是大。#include<iostream>#include<string.h>using namespace std

2020-06-19 15:35:17 107

原创 F2. Flying Sort 区间dp

F2. Flying Sort题意:给定n个数,n个数可能有相同的,每次操作只能选择一个数,将它放在这个数组的首位或者尾部,询问你最少需要进行多少次操作能够让这个数组非递减。题解:首先离散化一下,然后定义dp[i]代表全选a[i]的最长子序列的长度,定义子序列:子序列之外的元素都大于等于子序列的尾部或者小于等于子序列的首部。这里讲一下这个题的细节部分:就是你单纯看定义的子序列,你会发现这个子序列最大值和最小值相差1,你一定能想到,但是如果不是相差1,你需要考虑的就是全选首部或者尾部,这就是dp[i]为什

2020-06-17 23:47:44 113

原创 KMP 简单讲解

一种O(n+m)复杂度的字符串匹配算法,复杂度是很优秀的。我们来看看kmp算法具体思路:就是不移动回移主串p的位置,进行匹配,只移动模式串t的位置。首先我们知道如果p[j]==t[k],那么就 j++ , k++; 如果p[j] != t[k];按照kmp的思路就是回退k的位置,j不移动,那么怎么回退成了这个算法的关键。定义next[j] = k,代表含义t[0 – k-1] == t[j-1 – j-k+1]匹配;而且是最大长度的匹配,网上有的称作k为最大公共前缀后缀串长度,反正你理解就好,反正公式在

2020-05-30 11:39:24 317 2

原创 线段树维护dp

J - Journey to the “The World’s Start”题解:看了题目思路很清晰,二分价格,然后O(n)dp,但是dp[i] = min(dp[max(1,i-r)]…dp[i-1]) + d[i];所以需要维护一个区间dp的最小值,恰好用线段树就行,最后复杂度为O(nlognlogn)个人觉得我的代码是用线段树写最简短的。#include<bits/stdc++.h>#define ls o*2#define rs o*2+1using namespace s

2020-05-19 11:55:33 262 1

原创 左儿子右兄弟字典树

“strcmp()” Anyone?题意:给定n个单词,询问你每个单词两两用strcmp()函数比较,需要比较多少次。题解:用左儿子右兄弟字典树边插入边统计。我找了很多博客,没有详细去讲解左儿子右兄弟字典树的,在这我讲解一下,首先讲一下为什么要用这种结构,因为这种结构是能够最精确地用内存的。然后你对着代码模拟一遍,你就能知道son[u]代表u这个节点的子节点,有共同性就是属于字典树的同一层...

2020-04-21 21:07:28 432 1

原创 字典树入门

字典树终于稍微勉强地入了门。推荐博客题目 练习题

2020-04-20 22:34:26 136

原创 D-景区路线规划 概率dp+dfs

D-景区路线规划题意:从n个景点中任意一个出发,总共游览k分钟,从一个景点到达另一个景点需要花费一定时间,游览该景点需要花费一定时间,到达一个景点有一定的开心值,求开心值的期望。题解:设dp[u][t]代表到达节点u,剩余时间t 的开心值期望。然后对于每个点dfs一遍,代表以这个点为起点,同时最后答案要除n,也是因为这个。#include<bits/stdc++.h>#def...

2020-04-08 21:53:11 185

原创 G 街机争霸 BFS

G 街机争霸题解:因为每只僵尸都是限制在k内,所以可以引进时间维度。然后bfs。#include<bits/stdc++.h>using namespace std;int vis[550][550][30];int zj[550][550][30];char mp[550][550];int dx[4] = {-1,1,0,0} , dy[4] = {0,0,-1,1...

2020-03-09 00:29:44 84

原创 E 牛牛的随机数 数位dp

E 牛牛的随机数题解:思路就是算二进制每个位置的贡献,然后再将每个位置的贡献加起来就是总贡献。关键是数位dp咋写;我看了半天就是唯一想不通的地方就是为啥要lim == 0 时才能记忆化转移,同样才能给dp赋值。因为当lim==1时说明这个位置有限制所以你枚举的那个数位的数字可能就不是1,就可能多加贡献。所以需要没有限制的时候那么你枚举的数位必然可以达到1,所以可以无脑转移。#include...

2020-03-05 17:58:51 101

原创 H 施魔法 区间dp

H 施魔法题意:给你n个物品,每个物品有各自的权值,你每次至少选择k个物品作为一组,选择后这一组就会产生max(ai…ak) - min(ai…ak) 的贡献,要求你将n件物品分为x组后,总贡献最小。题解:首先肯定排序,这没有什么好解释的。设dp[i]代表i件物品的最小花费。那么dp[i] = min{ dp[j] + a[i] - a[j+1] } ( 1<= j <= i-...

2020-02-09 00:59:33 137

原创 几道贪心经典题

125. 耍杂技的牛题解: 我们假设已经排好序好了。对于第i头牛:sum[i-1] - si => sum[i-1] - si+1对于第i+1头牛:sum[i] - si+1 => sum[i-1] + wi+1 - sisum[i-1] + wi - si+1 => sum[i-1] + wi+1 - siwi+1 + si+1 >= wi + si那么这样...

2020-02-08 22:38:13 129

原创 几道字符串dp的题目

统计CCSU题解:dp[1][i]代表到第i个原串字符 ‘c’ 的字符串数量。dp[2][i]代表到第i个原串字符 'cc’的字符串数量。dp[3][i]代表到第i个原串字符 'ccs’的字符串数量。dp[4][i]代表到第i个原串字符 'ccsu’的字符串数量。#include<bits/stdc++.h>#define ll long longusing n...

2020-02-05 21:16:07 186

原创 F maki和tree 换根dp

F maki和tree题意:给你一颗树,每个节点被染成黑色和白色中的一种。问你有多少对<u,v>在u到v的路径上只有一个黑色点。题解:正解是并查集,但是我觉得能用换根dp写,现场赛没写出来,但是dp的大致思路是对的,赛后改了改,好久没写了,换根都有细节出错了。但是一眼还是换根dp。最后还是补了这个题。设dp[u][0]代表到节点u一个黑色点都没经过的点对数,dp[u][1]代表到节...

2020-02-04 21:11:47 195

原创 C. Famil Door and Brackets DP

C. Famil Door and Brackets题意:给定长度为m的字符串,需要你构造长度为n的字符串,且该字符串括号匹配,你可以在长度为m的字符串前面和后面添加字符串,问你有多少种构造方法。题解:dp[i][j]代表有i个’(’ ,j个‘)’能构造字符串的切括号匹配的字符串数量。一定保证i>=j。dp[i][j] = dp[i-1][j] + dp[i][j-1];那么我们计...

2020-02-03 17:21:38 193

原创 D. Magic Numbers 数位dp

D. Magic Numbers题意:明显数位dp,但是关键怎么写。题解:直接看代码,更加清晰。这个dp方程我其实想到了,但是还是不够熟练地写出来。第一维是数位,第二维是mode m 的余数 , 第三维是当前数位限制。排除不合法的方案(continue掉的)。ok函数就是检验b是否是个有效解。因为减答案的时候将b减掉了。#include<bits/stdc++.h>#defi...

2020-02-02 14:34:31 112

原创 C. Garland dp

C. Garland好久没发博客了,发个博客证明我活着!!!又是dp,设dp[i][j][k][2],代表填到第i位,有j个奇数,k个偶数,如果是1表示当前填的数是奇数,如果是0表示当前填的数是偶数。那么转移就简单了。如果当前位置能够随意填数,那么我们需要转移两个dp[i][j][k][0] 和 dp[i][j][k][1],dp[i][j][k][0] = min(dp[i-1][...

2020-01-19 12:37:52 128

原创 Hackers' Crackdown 状压dp

Hackers’ Crackdown题意:一共有n台电脑,每台电脑有n个服务,每台电脑有它相邻的电脑,我们对于n台电脑后,每台电脑选择一种服务,那么与它相邻的电脑的这种服务都瘫痪,问你最多能使多少种服务瘫痪。题解:看到n只有16,看能不能状压,我们处理一个p[i]也就相当于一个集合,代表第i台电脑能够影响的电脑,cov[i]代表选择了一些集合后,能够影响的服务,最后f[i]代表状态为i是,服务...

2019-12-18 17:02:15 141

原创 E. Nearest Opposite Parity 反向建图+bfs

E. Nearest Opposite Parity题意:对于每个位置的数i,如果i-a[i]>=1,那么我们就能跳到下表为i-a[i]的位置,如果i+a[i]<=n,那么我们就能跳到下标为i+a[i]的位置;我们需要求出对于每个位置的数,我们进行着两种操作的最小的次数到达与当前数奇偶性相反的数,如果不能达到输出-1。题解:一开始想当然,暴力bfs,直接就给我超时了,然后想怎么剪枝...

2019-12-17 00:17:45 289 1

原创 B.BE, GE or NE dp

B.BE, GE or NE题意:两个人玩游戏,每个人每轮有三个选择a,b,c;如果a=0,那么就不能选a ;同理b,c;选择a,那么在原来的分数上加上a,选择b,那么在原来的分数上减去b;选择c,那么在原来的分数上乘-1;先手想要最后的分数大于等于k;后手想要最后的分数小于等于l。题解:设dp[i][j]代表在第i轮,当前分数为j,如果我们顺序dp,那么就要考虑后效性,就是对于先手当前最大,...

2019-12-10 10:58:41 76

原创 D. Mysterious Code kmp+dp

D. Mysterious Code题意:给你三个串c,s,t,求f( c , s ) - f( c , t )最大,定义f( c , s )代表c串中子串为s的个数。题解:设dp[i][j][k]代表在c串中匹配到第i个位置,s串匹配到第j个位置,t串匹配到第k个位置的最大ans。但是在这个dp中有很多不可以到达的状态,那么我们也没必要由此转移。那么我们对于c[i+1]如果不等于 " * ...

2019-12-02 16:38:56 238

原创 F 简单图上操作 二分+bfs

F 简单图上操作题意:在一个无向图中,每条边都有权值,我们有k次跳过权值的车票超过v的边,问你从起点s到终点t,v的最小值是多少。题解:二分答案,我们维护一个dp[u]代表从起点s到节点u最少要花费的车票数量,那么我们只要判断dp[t]最后是否大于k就能知道答案是否合法。#include<bits/stdc++.h>using namespace std;const int ...

2019-12-02 13:54:11 116

原创 C求和公式 整除分块+数论

C求和公式题意:求化简:同理对于m;#include<bits/stdc++.h>#define ll long longusing namespace std;const int mod = 1e9+7;ll ksm(ll a,ll b){ ll res =1; while(b) { if(b&1) res = ...

2019-12-01 23:29:44 234

原创 E-XOR 思维题

E-XOR题意自己看。题解:我们计算每个位置的贡献,一共n个数,每个位置异或同一个数,那么假如n个数那位置1的个数为x,那么异或后会变为个数n-x。我们首先判断它是否合法,这样我们就能知道每个位置的最小贡献,如果相加还是大于m,那么肯定不行,那么合法之后,我们从最高位开始枚举,我们能否异或这个位置,我们异或后加上之后的每个位置的最小贡献会不会超过m,如果没有超过m,那么这个位置对答案产生贡献。...

2019-12-01 19:57:52 118

原创 简单树上操作 换根dp

简单树上操作我发现一个星期不训练,水平下降很多,这道一眼换根dp没看出来,还是太菜了,补题。题意:求多少对(x,y)之间的距离等于树直径。题解:树形dp维护,节点u到达的最远距离和到达最远距离的点的数量。然后换根dp枚举每个点。#include<bits/stdc++.h>#define ll long long#define pi pair<int,ll>...

2019-12-01 16:12:35 310

原创 商汤AI园区的n个路口(中等) 树形dp

商汤AI园区的n个路口(中等)题意:有n个点,n-1条边,要求每条边固定一个值为x,与这条边相邻的两个点的权值的gcd不等于x,权值的上限为m,然后问你有多少方案数,使之全成立。题解:设dp[u][i]代表u节点权值为i的方案数,转移就是u节点的子节点v来转移,如果此时m=4,x=2;那么dp[u][2] = dp[v][1]+dp[v][3];我们dp[v][j],j不能取2/4,那么我们需...

2019-11-24 12:11:32 121

原创 HDU 6578 Blank 区间dp

题意:构造一个长度为n的子串,要求在m个区间内,在[ li , ri ]保证要有x个不同的数。题解:我们设dp[t][i][j][k],代表{ 0 ,1,2,3 }四个数最后一次出现的位置。且保证( t >= i >= j >= k )。dp[t][i][j][k] += dp[t][i][j][k] ;// 填的数跟第t-1个数一样dp[t][t-1][i][j] += ...

2019-11-23 14:24:04 134

原创 D. Modulo Nine 区间Dp

D. Modulo Nine题意:满足m个限制条件,在 [ li , ri ] 中满足 a li * a li+1 * a ri mod 9 = = 0,问你有多少个长度为n的序列满足。题解:首先我们知道,如果区间有一个9,那么就满足,如果区间有两个3/6也是满足的。那么我们把9看成两个3,我们设dp[i][j][k]代表我们dp到第i位,最后满足限制条件的数出现的位置(也可以理解成倒数第一个...

2019-11-22 11:22:33 126

原创 E. Another Filling the Grid 计数dp

E. Another Filling the Grid 题意:要求n * n 个方格内,要求每行每列都有1,问你有多少种填法?题解:设dp[i][j]代表前i行,有j列存在数字1的方案数,对于下一个状态dp[i+1][p];我们分为两种情况讨论:if ( j == p ) 那么我们j列中必须要填一个数字1,j列的其他位置随便填,那么方案数位 k^ j - (k-1) ^ j ,剩余n-j...

2019-11-21 17:32:25 198

空空如也

空空如也

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

TA关注的人

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