Codeforces 1163D(kmp、dp)】的更多相关文章

要点 \(dp[i][j][k]\)表示主串已经到第\(i\)位时,\(s\)匹配在\(j\)位.\(t\)匹配在\(k\)位的最大得分 本来就要试填一层循环,如果转移也写在循环里的化复杂度承受不了,于是开两个表kmp预处理一下. #include <cstdio> #include <cstring> #include <algorithm> using namespace std; char ch[1010], s[55], t[55]; int len, ls,…
要点 '&'操作暗示二进制上按位思考 对于y为1的位,要求x和y之间要至少有两个此位为1的(包含x.y),这样&起来才不是0.而这些位中只要存在一个是ok的即可 dp去求每个x的每个位最早到达的y const int maxn = 3e5 + 5, Log = 20; int n, q, a[maxn]; int go[maxn][Log + 5], Last[Log + 5]; int main() { read(n), read(q); rep(i, 1, n) read(a[i]);…
codeforces 932E Team Work 题意 给定 \(n(1e9)\).\(k(5000)\).求 \(\Sigma_{x=1}^{n}C_n^xx^k\). 题解 解法一 官方题解 的做法,网上有很多,就不写了. 解法二 从组合数学的角度入手. 参考博客 我们可以这样理解这个式子 \(\Sigma_{x=1}^{n}C_n^xx^k\) :有 \(n\) 种小球,从中选出 \(x\) 种,再选出 \(k\) 个小球,这 \(k\) 个小球只能来自选定的 \(x\) 种类别.求方案…
https://www.luogu.com.cn/problem/P1025 题目描述 将整数n分成k份,且每份不能为空,任意两个方案不相同(不考虑顺序). 例如:n=7,k=3,下面三种分法被认为是相同的. 1,1,5;1,5,1;5,1,1. 问有多少种不同的分法. 输入格式 n,k (6<n≤200,2≤k≤6) 输出格式 1个整数,即不同的分法. 输入输出样例 输入  输出 说明/提示 四种分法为:1,1,5;1,2,4;1,3,3;2,2,3. 解法一(DFS): DFS算是比较容易想…
时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:316 解决:29 题目描述: 把n个骰子扔在地上,所有骰子朝上一面的点数之和为S.输入n,打印出S的所有可能的值出现的概率. 输入: 输入包括一个整数N(1<=N<=1000),代表有N个骰子. 输出: 可能有多组测试数据,对于每组数据, 按照Sample Output的格式输出每一个可能出现的和S的概率. 样例输入: 1 2 样例输出: 1: 0.167 2: 0.167 3: 0.167 4: 0.167 5: 0.167 6:…
Codeforces 126B. Password 题意:一个字符串,找出最长的子串t,它既是前缀又是后缀,还出现在中间.输出t,不存在则输出Just a legend. 思路:利用KMP算法处理出next数组,由next数组的意义可以知道i为尾的最长相同前缀后缀.则ne[n-1],ne[ne[n-1]],ne[ne[ne[n-1]]]......均为可能的解,且长度递减,为了高效的逐一验证,则需要预处理出整个字符串有多少个与该前缀相同的子串.用到DP思想,cnt[next[i]]+=cnt[i…
http://codeforces.com/contest/1203/problem/F1 Examples input 1 - - output 1 YES input 2 - - output 2 YES input 3 - - output 3 YES input 4 - output 4 NO Note In the first example, the possible order is: 1,2,3. In the second example, the possible order…
题意 给定一个字符串 \(s\) ,一个字符串 \(t\) ,其中 \(s\) 包含小写字母和 "?" ,\(t\) 只包含小写字母,现在把 \(s\) 中的问号替换成任意的小写字母,求 \(t\) 最多在 \(s\) 中出现多少次,\(t\) 可以互相覆盖. \(1 \leq |s| \leq 10^5\) \(1 \leq |t| \leq 10^5\) \(1 \leq |s|\cdot|t| \leq 10^7\) 思路 由于 \(|s|\cdot|t| \leq 10^7\)…
题目链接:http://codeforces.com/contest/651/problem/C 思路:结果就是计算同一横坐标.纵坐标上有多少点,再减去可能重复的数量(用map,pair存一下就OK了). #include<bits/stdc++.h> using namespace std; typedef long long ll; typedef pair <int,int> pii; const int N = 2e5 + 5; map <int,int> x,…
题目链接:http://codeforces.com/contest/721/problem/C 题意:从1走到n,问在时间T内最多经过多少个点,按路径顺序输出. 思路:比赛的时候只想到拓排然后就不知道怎么办了......先拓扑排序,再按照拓扑的顺序进行DP,dp[to][j](到i点走过j个点最短时间) = min(dp[to][j], dp[i][j] + dis) #include<bits/stdc++.h> using namespace std; typedef long long…
Time Limit: 1000 ms   Memory Limit: 256 MB Description  给定一个由且仅由字符 'H' , 'T' 构成的字符串$S$. 给定一个最初为空的字符串$T$ , 每次随机地在$T$的末尾添加 'H' 或者 'T' . 问当$S$为$T$的后缀时, 在末尾添加字符的期望次数. Input 输入只有一行, 一个字符串$S$. Output 输出只有一行, 一个数表示答案. 为了防止运算越界, 你只用将答案对$10^9+7$取模. Sample Inp…
时间限制:3 秒 内存限制:32 兆 特殊判题:否 提交:213 解决:66 题目描述: 角斗士是古罗马奴隶社会的一种特殊身份的奴隶,他们的职责是在角斗场上进行殊死搏斗,为了人们提供野蛮的娱乐.他们的结局或是战死,或者由于表现突出赢得胜利而获得释放. 现在在角斗场里有N个待战的角斗士(1 <=N<=18),每天都将举行一场比赛,为了保持比赛的刺激性,每场比赛前才会在所有当前活着的角斗士之中随机选择两名进行上场拼杀.每场比赛的结束条件即为其中一名被杀死.当进行了N场比赛之后,最后存活的角斗士将被…
判断一个字符串是否是另一个字符串的子串,也就是strstr()函数的实现,简单的实现方法是BF算法. 1.BF算法 int BF(char *s, char *p){ ; ; int j; while(i<strlen(s)){ j=; while(s[i]==p[j] && j<strlen(p)){ i++; j++; } if(j==strlen(p))return i-j; i=i-j+; } ; } 2.KMP算法 KMP算法的原理有很多文章解释,这就不说了(我也看得…
You are given an integer array of length nn. You have to choose some subsequence of this array of maximum length such that this subsequence forms a increasing sequence of consecutive integers. In other words the required sequence should be equal to […
Count the string Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 14368 Accepted Submission(s): 6572 Problem Description It is well known that AekdyCoin is good at string problems as well as number…
翻译 给定一个二叉树root和一个和sum, 决定这个树是否存在一条从根到叶子的路径使得沿路全部节点的和等于给定的sum. 比如: 给定例如以下二叉树和sum=22. 5 / \ 4 8 / / \ 11 13 4 / \ \ 7 2 1 返回真.由于这里存在一条根叶路径(5->4->11->2),它的和为22. 原文 Given a binary tree and a sum, determine if the tree has a root-to-leaf path such tha…
传送门:https://codeforces.com/problemset/problem/11/D 题意: 求n个点m条边的图里面环的个数 题解: 点的范围只有19,很容易想到是状压. dp[sta][a]表示状态为sta,终点为n时环的个数 转移: dp[sta | (1 << i)][i] += dp[sta][e]; 由于是无向边,所以答案会重复计算一遍,最后要记得除2 代码: #include <set> #include <map> #include <…
Little Pony and Harmony Chest 经典状态压缩dp #include <cstdio> #include <cstring> #include <cstdlib> #include <iostream> #define min(x,y) (x>y?y:x) using namespace std; ],all,n,a[],b[][<<],pre[][<<],s1,s0,f[][<<],ans…
On his free time, Chouti likes doing some housework. He has got one new task, paint some bricks in the yard. There are nn bricks lined in a row on the ground. Chouti has got mm paint buckets of different colors at hand, so he painted each brick in on…
多校9 1001 hdu 6161 Big binary tree 题意 有一个完全二叉树.编号i的点值是i,操作1是修改一个点的值为x,操作2是查询经过点u的所有路径的路径和最大值.10^5个点,10^8次操作. 题解 用map储存修改过的点的值val,和dp[i],表示i子树的最大路径和. 查询就是考虑两种情况,经过u点的两个孩子和经过它的一个孩子再经过它父亲,需要边走到根节点边更新答案. 代码 #include <cstdio> #include <algorithm> #i…
要点 一开始dp然后码力太辣鸡并且算法带假于是调了很久一交还WA在28-- 吐槽完毕.后来想拿栈优化dp时发现其实完全不需要dp,贪心选取即可,当前的不兼容就干脆不要它了,结果不会变差.然后想要什么就预处理什么即可. #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #include <vector> #include <unorder…
题目传送 推公式博客传送 推完式子就是去朴素地求就行了Orz const int maxn = 1e5 + 5; const int mod = 1e9 + 7; int m, mu[maxn], vis[maxn], primes[maxn], tot; ll dp[maxn]; vector<int> factor[maxn]; ll ksm(ll a, ll b) { ll ret = 1; for (; b; b >>= 1) { if (b & 1) ret =…
题目传送 官方题解说的很好了,剩下的就是读大佬代码了,前面是tarjan求SCC缩点图.我图论没学过,接下来删点是怎么操作看得有点头秃,直到我看到了%%%安德鲁何神仙的代码. 按照题面连通紫线以后,我们姑且先考虑从入度为0的点着手看看是否可行.由于都是入度为0的点,所以现在我们连的都是绿边. 假如连了\[a\rightarrow b\]这条边,而又有\[b\rightarrow c\]这条紫边,那显然是要断开的,然后c如果入度为0,它也成为了一个候选. 这种做法会不会导致一开始a连向b的,然后我…
蒜头君很早就想出国,现在他已经考完了所有需要的考试,准备了所有要准备的材料,于是,便需要去申请学校了.要申请国外的任何大学,你都要交纳一定的申请费用,这可是很惊人的.蒜头君没有多少钱,总共只攒了n万元.他将在m个学校中选择若干的(当然要在他的经济承受范围内).每个学校都有不同的申请费用a (万美元),并且蒜头君估计了他得到这个学校offer的可能性b. 不同学校之间是否得到offer不会互相影响."I NEED A OFFER",他大叫一声.帮帮这个可怜的人吧,帮助他计算一下,他可以收…
思路 不难想到枚举\(l\),那如何高效求出最小的\(r\)?这样答案加上\(x-r+1\)即可. 如果\(l\)并没在序列里出现--没啥想法:如果\(l\)是序列里的数,我们可以做的事情是记下每个数出现的每个pos.观察可以发现如果某数小于\(l\)且在序列里出现过,则它不会被删,则:它的区间内所有跟它不同的数得都删掉:更小的数的右端点必须在它的左端点左边. \(r\)还有个限制条件就是:比如如果序列中出现\(r+3\)在\(r+2\)左边,则不得不把\(r\)提高到\(r+2\),因此可以知…
要点 可以贪心选数量最多的那三个构造 二分的话里面的check我不太会.正解是既然当前答案为\(k\)个,那每个物品最多只会出现\(k\)次,多余的丢掉,剩下的总数如果大于等于\(3k\)则true.最后输出答案时也是小小技巧吧,用\({1,1+k,1+2k}\)组成一组,因为多于\(k\)个的都删了所以这三个一定不同. #include <cstdio> #include <algorithm> #include <vector> #include <queue…
要点 因为当前最大字符只有一个且两边是回文的,所以如果答案包含最大字符则一定是重合部分. 若不包含,则用此字符将两个区间分别断为两部分,则共有四种组合,答案一定为其中之一. #include <cstdio> #include <algorithm> using namespace std; int l1, l2, r1, r2; int Divide(int a, int b, int c, int d, int depth) { if (a > b || c > d…
时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:948 解决:554 题目描述: 有一个神奇的口袋,总的容积是40,用这个口袋可以变出一些物品,这些物品的总体积必须是40.John现在有n个想要得到的物品,每个物品的体积分别是a1,a2--an.John可以从这些物品中选择一些,如果选出的物体的总体积是40,那么利用这个神奇的口袋,John就可以得到这些物品.现在的问题是,John有多少种不同的选择物品的方式. 输入: 输入的第一行是正整数n (1 <= n <= 20),表示不同的…
自己水平太低,不丢人. 结论是最后选取的数后缀一定是若干个9,暴举即可.然而暴举也有暴举的艺术. ll n; ll dfs(ll n) { if (n == 0) return 1; if (n < 10) return n; return max(dfs(n / 10) * (n % 10), dfs(n / 10 - 1) * 9); } int main() { ios_base::sync_with_stdio(0), cin.tie(0), cout.tie(0); cin >>…
可以变换坐标:x' = x, y' = y - x ^ 2,如此之后可得线性函数x' * b + c = y',可以发现两点连边为抛物线,而其他点都在这条线下方才满足题意,故而求一个上凸壳即可. #include <cstdio> #include <cmath> #include <iostream> #include <algorithm> #include <vector> using namespace std; typedef long…