首页
Python
Java
IOS
Andorid
NodeJS
JavaScript
HTML5
【
KMP + BZOJ 4974 [Lydsy1708月赛]字符串大师
】的更多相关文章
KMP + BZOJ 4974 [Lydsy1708月赛]字符串大师
KMP 重点:失配nxtnxtnxt数组 意义:nxt[i]nxt[i]nxt[i]表示在[0,i−1][0,i-1][0,i−1]内最长相同前后缀的长度 图示: 此时nxt[i]=jnxt[i]=jnxt[i]=j,即指向最长相同前后缀的后一位置,数值上是最长相同钱后缀的长度 求法:假设我们已知nxt[i−1]nxt[i-1]nxt[i−1],想要求nxt[i]nxt[i]nxt[i] 当str(nxt[i−1])=str(i−1)str(nxt[i-1])=str(i-1)str(nxt[i…
bzoj 4974 [Lydsy1708月赛]字符串大师 KMP 最小循环元 构造
LINK:字符串大师 给出一个字符串的每个前缀的最小循环元 还原字典序最小的原字符串. 一个比较显然的结论 或者说 学过KMP的都知道 对于每个前缀i求出nex数组后 那么i-nex[i]为最小循环元. 这道题择则是给出每个前缀的最小循环元 由于题目中保证有解 我们可以推得 nex[i]=i-循环元长度.由于存在解 说明对于nex[i]!=0的时候直接到使用nex[i]的字符即可. 当nex[i]==0时我们可以调nex 把不合法的字符都给标记一下 然后重新选择字符即可. 注意边界问题 nex[…
BZOJ4974:[Lydsy1708月赛]字符串大师(逆模拟KMP)
题目描述 一个串T是S的循环节,当且仅当存在正整数k,使得S是T k Tk (即T重复k次)的前缀,比如abcd是abcdabcdab的循环节.给定一个长度为n的仅由小写字符构成的字符串S,请对于每个k(1<=k<=n),求出S长度为k的前缀的最短循环节的长度per i peri .字符串大师小Q觉得这个问题过于简单,于是花了一分钟将其AC了,他想检验你是否也是字符串大师. 小Q告诉你n以及per 1 ,per 2 ,...,per n per1,per2,...,pern ,请找到一个…
【思维题 kmp 构造】bzoj4974: [Lydsy1708月赛]字符串大师
字符串思博题这一块还是有点薄弱啊. Description 一个串T是S的循环节,当且仅当存在正整数k,使得S是T^k(即T重复k次)的前缀,比如abcd是abcdabcdab的循环节 .给定一个长度为n的仅由小写字符构成的字符串S,请对于每个k(1<=k<=n),求出S长度为k的前缀的最短循环节的 长度per_i.字符串大师小Q觉得这个问题过于简单,于是花了一分钟将其AC了,他想检验你是否也是字符串大师. 小Q告诉你n以及per_1,per_2,...,per_n,请找到一个长度为n的小写字…
BZOJ4974:[lydsy1708月赛]字符串大师
浅谈\(KMP\):https://www.cnblogs.com/AKMer/p/10438148.html 题目传送门:https://lydsy.com/JudgeOnline/problem.php?id=4974 首先\(per_i=i-nxt_i\),然后我们可以根据\(per_i\)求出\(nxt_i\). 其次,我们再进行一遍求\(nxt\)的过程,一位一位的确定这个字符串. 因为\([1,i-1]\)都已经确定了,所以根据\(nxt_i\)我可以知道第\(i\)位与哪些位失配了…
bzoj4974: [Lydsy1708月赛]字符串大师
脑洞题...玄学 假如是a[i]!=i,说明构成了循环节长为a[i]的循环,那就去%一下(别想多)看一下是循环节中的第几个咯. 否则新填的这个不能和前面构成任何循环,那就不停往前跳去把不能填的标记一下,直到找到a[i]==i,说明再也不构成循环了. #include<cstdio> #include<iostream> #include<cstring> #include<cstdlib> #include<algorithm> #include…
bzoj 4974: [Lydsy八月月赛]字符串大师
4974: [Lydsy八月月赛]字符串大师 Time Limit: 1 Sec Memory Limit: 256 MBSubmit: 371 Solved: 190[Submit][Status][Discuss] Description 一个串T是S的循环节,当且仅当存在正整数k,使得S是T^k(即T重复k次)的前缀,比如abcd是abcdabcdab的循环节 .给定一个长度为n的仅由小写字符构成的字符串S,请对于每个k(1<=k<=n),求出S长度为k的前缀的最短循环节的 长度pe…
BZOJ4974 大视野1708月赛 字符串大师
传送门 题目大意 给定一个字符串的每一个前缀的最短循环节长度,求符合要求的字典序最小的字符串. 题解 给定循环节最短长度就是给定了这个字符串$kmp$的$next$数组,即$X_i=i-next_i$,$X_i$表示给定的循环节长度. 由于答案一定有解,考虑模拟构造一个这样的字符串,并模拟求它的$next$数组的过程.如果匹配到发现$i$从$j$处转移,那么就用$j$处的字母赋给$i$,否则就得到了$i,j$互不相同的条件,我们就得到了一个$i$不能取得字符集$S$,对$S$取$mex$即可.…
bzoj4974: [Lydsy八月月赛]字符串大师
传送门 题目可转换为已知一个串kmp之后的nxt数组,求字典序最小的原串. 已知第i位结尾的串循环节长度位x,那么nxt[i]=i-x; 当nxt不为0时,s[i]=s[nxt[i]]; nxt为0时,那么考虑kmp的过程,沿着nxt[i-1]一直往前跑找到的每一个j,s[j+1]都不能是现在的s[i],那么在一路求nxt的过程中就从前往后递推用一个二进制串表示一路的nxt的后一位出现过的字母,然后每次取未出现过的字典序最小的字母即可: //Achen #include<algorithm>…
【刷题】BZOJ 4977 [Lydsy1708月赛]跳伞求生
Description 小Q最近沉迷于<跳伞求生>游戏.他组建了一支由n名玩家(包括他自己)组成的战队,编号依次为1到n.这个游 戏中,每局游戏开始时,所有玩家都会从飞机上跳伞,选择一个目的地降落,跳伞和降落的时间有早有晚.在某局 游戏降落前,他们在空中观察发现地面上一共有m间房子,编号依次为1到m.其中每间房子恰好有一名敌人早于他 们到达.小Q战队的第i名玩家拥有a_i发子弹,地面上第i间房子里的敌人拥有b_i发子弹,消灭他可以获得c_i点积 分.每名玩家必须且只能选择一间房子降落,然后去消…
BZOJ 4971: [Lydsy1708月赛]记忆中的背包
神仙构造 分成x个1和一堆>=w-x的大物品 (x<=20 w>=50) 则拼成w的方案中有且仅有一个大物品 若最终序列中有x个1,有一个大物品为w-k,可以提供C(x,k)种方案 F[i][j]表示最终序列有i个1,方案数为j的最少大物品数 我也没算过为什么20就够了 但是20就是够了 模数这个神奇的东西没有用场 #include<cstdio> using namespace std; int C[25][25],F[25][20005],Pre[25][20005];…
bzoj 4975: [Lydsy1708月赛]区间翻转【博弈论】
必败状态是倒序排列,也就是正序对为0 然后发现,每次翻转都是有奇数个数对(\( C_{4x+2}^{2} C_{4x+3}^{2} \) 都是奇数),所以每次翻转丢回改变正反数对的奇偶性 又因为偶数为必败状态,所以顺序对为奇数则必胜 #include<iostream> #include<cstdio> using namespace std; int n,a[55],ans; int main() { scanf("%d",&n); for(int i…
BZOJ 4976 [Lydsy1708月赛]宝石镶嵌
[题解] 我们设总共有m个二进制位出现过1,那么如果n-k≥m,显然所有的1都可以出现,那么答案就是把所有的数或起来. 如果n-k<m,那么因为k不超过100,ai不超过1e5,所以n不超过117,直接n*1e5的Dp即可. Dp的方式也是多种多样,如果设f[i][j]表示前i个数字或出j最少需要几个数字,那么转移方程为f[i][j|a[i]]=min(f[i-1][j|a[i]],f[i-1][j]+1]). #include<cstdio> #include<cstring&g…
[BZOJ4947] 字符串大师 - KMP
4974: [Lydsy1708月赛]字符串大师 Time Limit: 1 Sec Memory Limit: 256 MBSubmit: 739 Solved: 358[Submit][Status][Discuss] Description 一个串T是S的循环节,当且仅当存在正整数k,使得S是T^k(即T重复k次)的前缀,比如abcd是abcdabcdab的循环节 .给定一个长度为n的仅由小写字符构成的字符串S,请对于每个k(1<=k<=n),求出S长度为k的前缀的最短循环节的 长度…
BZOJ4974 八月月赛 Problem D 字符串大师 KMP
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ4974 - 八月月赛 Problem D 题意概括 一个串T是S的循环节,当且仅当存在正整数k,使得S是T^k(即T重复k次)的前缀,比如abcd是abcdabcdab的循环节.给定一个长度为n的仅由小写字符构成的字符串S,请对于每个k(1<=k<=n),求出S长度为k的前缀的最短循环节的长度per_i.字符串大师小Q觉得这个问题过于简单,于是花了一分钟将其AC了,他想检验你是否也是字符串大师.…
bzoj 4974: 字符串大师
Description 一个串T是S的循环节,当且仅当存在正整数k,使得S是T^k(即T重复k次)的前缀,比如abcd是abcdabcdab的循环节 .给定一个长度为n的仅由小写字符构成的字符串S,请对于每个k(1<=k<=n),求出S长度为k的前缀的最短循环节的 长度per_i.字符串大师小Q觉得这个问题过于简单,于是花了一分钟将其AC了,他想检验你是否也是字符串大师. 小Q告诉你n以及per_1,per_2,...,per_n,请找到一个长度为n的小写字符串S,使得S能对应上per. 解题…
【BZOJ4974】字符串大师 KMP
[BZOJ4974]字符串大师 Description 一个串T是S的循环节,当且仅当存在正整数k,使得S是T^k(即T重复k次)的前缀,比如abcd是abcdabcdab的循环节.给定一个长度为n的仅由小写字符构成的字符串S,请对于每个k(1<=k<=n),求出S长度为k的前缀的最短循环节的长度per_i.字符串大师小Q觉得这个问题过于简单,于是花了一分钟将其AC了,他想检验你是否也是字符串大师.小Q告诉你n以及per_1,per_2,...,per_n,请找到一个长度为n的小写字符串S,使…
【bzoj4974】字符串大师 逆模拟KMP
题目描述 一个串T是S的循环节,当且仅当存在正整数k,使得S是$T^k$(即T重复k次)的前缀,比如abcd是abcdabcdab的循环节.给定一个长度为n的仅由小写字符构成的字符串S,请对于每个k(1<=k<=n),求出S长度为k的前缀的最短循环节的长度$per_i$.字符串大师小Q觉得这个问题过于简单,于是花了一分钟将其AC了,他想检验你是否也是字符串大师. 小Q告诉你n以及$per_1,per_2,...,per_n$,请找到一个长度为n的小写字符串S,使得S能对应上per. 输入 第一…
bzoj4974 字符串大师
4974: 字符串大师 Time Limit: 1 Sec Memory Limit: 256 MBSubmit: 310 Solved: 155[Submit][Status][Discuss] Description 一个串T是S的循环节,当且仅当存在正整数k,使得S是T^k(即T重复k次)的前缀,比如abcd是abcdabcdab的循环节 .给定一个长度为n的仅由小写字符构成的字符串S,请对于每个k(1<=k<=n),求出S长度为k的前缀的最短循环节的 长度per_i.字符串大师小Q…
BZOJ4978: [Lydsy1708月赛]泛化物品(乱搞)
4978: [Lydsy1708月赛]泛化物品 Time Limit: 5 Sec Memory Limit: 256 MBSubmit: 220 Solved: 70[Submit][Status][Discuss] Description 泛化物品是背包问题里的一个概念,泛化物品并没有固定的体积和费用,而是它的费用随着分配给它的体积而变化 .在背包容量为V-1的背包问题中,泛化物品是一个定义域为[0,V)中的整数的函数h,当分配给它的体积为v时,花 费的费用就是h(v).这个定义有一点点…
BZOJ4977: [[Lydsy1708月赛]跳伞求生(不错的贪心)
4977: [[Lydsy1708月赛]跳伞求生 Time Limit: 5 Sec Memory Limit: 256 MBSubmit: 446 Solved: 142[Submit][Status][Discuss] Description 小Q最近沉迷于<跳伞求生>游戏.他组建了一支由n名玩家(包括他自己)组成的战队,编号依次为1到n.这个游 戏中,每局游戏开始时,所有玩家都会从飞机上跳伞,选择一个目的地降落,跳伞和降落的时间有早有晚.在某局 游戏降落前,他们在空中观察发现地面上一…
BZOJ4975: [Lydsy1708月赛]区间翻转( 博弈&逆序对)
4975: [Lydsy1708月赛]区间翻转 Time Limit: 1 Sec Memory Limit: 256 MBSubmit: 265 Solved: 140[Submit][Status][Discuss] Description 小Q和tangjz正在一个长度为n的序列a_1,a_2,...,a_n上玩一个有趣的关于区间翻转的游戏.小Q和tangjz轮流行动 ,小Q先手.每次行动方玩家需要选择一个长度为4x+2或4x+3的区间[l,r](1<=l<=r<=n),其中x…
BZOJ4976: [Lydsy1708月赛]宝石镶嵌
BZOJ4976: [Lydsy1708月赛]宝石镶嵌 https://lydsy.com/JudgeOnline/problem.php?id=4976 分析: 本来是从\(k\le 100\)这里入手,想了想还是不能列出一个和\(k\)有关的式子. 看到\(n\)有点大了,当\(n-k>log\)的时候显然能全取到. 否则\(n\le k+log\)不超过\(117\),暴力即可 . 代码: #include <cstdio> #include <cstring> #in…
BZOJ 4556 [HEOI2016/TJOI2016]字符串
BZOJ 4556 [HEOI2016/TJOI2016]字符串 其实题解更多是用后缀数组+数据结构的做法,貌似也不好写. 反正才学了 sam 貌似比较简单的做法. 还是得先二分,然后倍增跳到 $ s[c...c+mid-1] $ 所在的节点,然后看看有没有 endpos 在 $ a+mid-1...b $ 内就好了. 复杂度是二分和倍增的 $ nlog^2n $. 其实这道题因为只用求 endpos 是否存在啥的 vector + lower_bound 貌似都可以过了..但其实启发式合并也不…
【bzoj5130】[Lydsy12月赛]字符串的周期 DFS+KMP
题目描述 给定 $n$ 和 $m$ ,求所有 长度为 $n$ ,字符集大小为 $m$ 的字符串,每个前缀的最短循环节长度乘积 的总和. $n\le 12,m\le 10^9$ 题解 DFS+KMP 对于字符串中的每一种字符,将其看作:该字符第一次出现位置之前的字符种类数+1,把得到的序列称为“该字符串的最小表示”. 那么显然本题中最小表示相同的字符串的答案是一样的.$n$ 很小,因此可以暴搜最小表示序列,然后计算贡献,乘以最小表示为这个序列的字符串个数统计到答案中. 统计贡献时使用到KMP的一个…
BZOJ4974 字符串大师(kmp)
显然最短循环节长度=i-next[i],则相当于给定next数组构造字符串.然后按照kmp的过程模拟即可.虽然这看起来是一个染色问题,但是由图的特殊性,如果next=0只要贪心地选最小的就可以了,稍微想一下容易证明. #include<iostream> #include<cstdio> #include<cmath> #include<cstdlib> #include<cstring> #include<algorithm> #i…
bzoj4974 字符串大师 KMP
明显的,有$next[i] = i - pre[i]$ 根据$next[i]$构造比根据$pre[i]$简单 如果$next[i] \neq 0$,那么我们可以直接取前面的结果 否则,我们可以暴力的寻找$next[i - 1], next[next[i - 1]] ...$后一位中最小没有出现过的字符 暴力的复杂度为$O(n)$ 不妨考虑有一棵$next$树 最坏情况下,我们会从每个叶子节点走到根一遍 对于需要走的每个叶子节点$x$,都有$next[x + 1] = 0$ 并且从叶子节点走到根的…
BZOJ.4598.[SDOI2016]模式字符串(点分治 Hash)
LOJ BZOJ 洛谷 点分治.考虑如何计算过\(rt\)的答案. 记\(pre[i]\)表示(之前的)子树内循环匹配了\(S\)的前缀\(i\)的路径有多少,\(suf[i]\)表示(之前的)子树内循环匹配了\(S\)的后缀\(i\)的路径有多少. 一个点如果能作为前缀\(dep\%m\)出现,然后\(s[rt]=s[dep\%m+1]\),就可以统计\(suf[m-dep\%m-1]\)的贡献. 作为后缀出现同理. 判某个深度\(dep\)是否是循环匹配了\(S\)的前缀\(i\),本来想的…
KMP算法(改进后的字符串匹配算法)
转载:http://blog.csdn.net/liu88010988/article/details/50789960 kmp算法完成的任务是:给定两个字符串O和f,长度分别为n和m,判断f是否在O中出现,如果出现则返回出现的位置.常规方法是遍历a的每一个位置,然后从该位置开始和b进行匹配,但是这种方法的复杂度是O(nm).kmp算法通过一个O(m)的预处理,使匹配的复杂度降为O(n+m). 这种算法不太容易理解,网上有很多解释,但读起来都很费劲.直到读到Jake Boxer的文章,我才真正理…
【刷题】BZOJ 4259 残缺的字符串
Description 很久很久以前,在你刚刚学习字符串匹配的时候,有两个仅包含小写字母的字符串A和B,其中A串长度为m,B串长度为n.可当你现在再次碰到这两个串时,这两个串已经老化了,每个串都有不同程度的残缺. 你想对这两个串重新进行匹配,其中A为模板串,那么现在问题来了,请回答,对于B的每一个位置i,从这个位置开始连续m个字符形成的子串是否可能与A串完全匹配? Input 第一行包含两个正整数m,n(1<=m<=n<=300000),分别表示A串和B串的长度. 第二行为一个长度为m的…