前缀和(P2697 宝石串)】的更多相关文章

Luogu P1114 "非常男女"计划/Luogu P2697 宝石串 (感觉我最近很爱做双倍经验的题啊) 使$d$等于第$i$个位置男生数(绿宝石数)减女生数(红宝石数)的差值. 那么差值相等的两个位置之间的人(宝石)是满足相等的. 所以找到在差值相等情况下最左边和最右边的位置. 特别要注意要把$0$的位置作为差值为$0$的起点. (两道题的读入略微有些不同) Luogu P1114 #include<bits/stdc++.h> using namespace std…
前言 每次做出来什么本来做不出的题目,就忍不住记录一下.不过大多时候隔几天来看,就发现,啊,我当时只是做了一道这么弱智的题目呀,哈哈.前缀和确实不算太难.. 传送门 题目大意: 给你一个字符串只含G和R,求一个最长子串长度,使得两个字符的长度相等.(给的字符串长小于1e6) 如:GRGGRG 答案是:4. 思路 题目中字符串很长,暴力枚举显然不可能. 但我们仔细一看,发现不过只有两个字符G和H.我们令G为1,令R为-1,那么GR的值就为0,这显然是一个可行的子串. 那再看GRGGRG,我们开一个…
题目传送门 解题思路: 将红色的设置为-1,绿色的为1,统计前缀和sum,如果sum[i] == sum[j],则说明i~j是一个稳定的区间 因为答案要求最大,所以我们要记录每个sum值的最左端点(也就是哪个位置第一次出现某个sum值) 每当遇到某个sum值,便利用最左端点求出区间长度,更新答案 吐槽:洛谷标签里是个DP,我就没往其他方面考虑,实在想不出来看了一下题解,tm我信你个鬼,这tm算DP?******(some bad words)反正我不认为这是个DP 最终结论:我太菜了......…
题意: 给出一个字符串,在所有长度大于1的前缀中,求所有的周期至少为2的周期串,并输出一个周期的长度以及周期的次数. 分析: 有了上一题 HDU 3746 的铺垫,这道题就很容易解决了 把next求出来,然后逐个判断即可. #include <cstdio> #include <cstring> + ; char p[maxn]; int n, next[maxn]; void get_next() { , j = ; next[] = -; while(j < n) { |…
http://acm.hdu.edu.cn/showproblem.php?pid=6153 首先相当于翻转两个串,然后求s2前缀在s1中出现的次数. 这是一个套路啦 首先把两个串结合起来,中间加一个'%'之类的分割 设dp[i]表示前缀1---i在本串中的出现次数和 那么从后开始dp,所有dp值一开始都是1,表示前缀出现了一次,就是自己本身. 转移,设当前去到第i位,则dp[next[i + 1] - 1] += dp[i] 就是ABACABA这样,已经知道了ABACABA出现了一次,然后前后…
题目大意:给你两个字符串,找出一个最大的子串,这个子串要是前面串的前缀并且是后面串的后缀...........   分析:next的简单运用吧,可以把两个串进行合并,中间加一个不能被匹配的字符,然后求出来next就行了.......确实很水 代码如下: ========================================================================================================= #include<stdio.h>…
O(n)的复杂度求回文串:Manacher算法 定义一个回文值,字符串S是K重回文串,当且仅当S是回文串,且其长度为⌊N/2⌋的前缀和长度为⌊N/2⌋的后缀是K−1重回文串 现在给一个2*10^6长度的字符串,求其每个前缀的最大回文值之和. 设dp[i]为长度为i的前缀的最大回文值. 当长度为i的前缀的字符串是回文串的时候,有:dp[i]=dp[i/2]+1 若不是回文串 dp[i]=0 接下来就是怎么样快速的判断回文串了,推荐算法Manacher算法. Manacher算法先对字符串进行修改…
「BZOJ 4502」串 题目描述 兔子们在玩字符串的游戏.首先,它们拿出了一个字符串集合 \(S\),然后它们定义一个字符串为"好"的,当且仅当它可以被分成非空的两段,其中每一段都是字符串集合 \(S\) 中某个字符串的前缀.比如对于字符串集合 \(\{ "abc","bca" \}\),字符串 \("abb"\),\("abab"\)是"好"的 \(("abb"=…
题意:       给你一个串,问你他的所有前缀子串在本串中的出现次数,注释:abc的前缀子串是 a ab abc; 思路:      还是利用了next数组,先对子串求出next数组,再开一个数组dp,初始化全是1,因为每个以当前i结尾的都至少是1,然后从后往前更新,把以i结尾的加到以next[i]结尾的上, 运用的next数组的特点相当于 123123123 最后一个3加到倒数第二个3,倒数第二个3再加到第一个3 那么以3结尾的(123)出现了三次,以3结尾的(123123)出现了两次,以3…
将s所有长度为d/2的子串放进ac自动机中,直接匹配就可以判定半现串了再对其做一个差分,询问一个前缀的半现串个数,在ac自动机上数位dp,f[i][j][0/1]表示走了i步(i位的字符串),走到节点j,是否达到上限的方案数对于ac自动机上的结束节点,直接重置并累计答案即可 1 #include<bits/stdc++.h> 2 using namespace std; 3 #define N 1005 4 #define c (s[i]-'0') 5 #define mod 10000000…