CF1320 Div1 D.Reachable Strings 题解】的更多相关文章

题目大意 给定一个长为\(n\)的01串\(S\),每次你可以对一个串的三个连续位置做:\(011 \rightarrow 110\),\(110 \rightarrow 011\)的操作. 有\(q\)次询问,每次询问给出两个长度相等的子串,问是否能从一个串变到另一个串. 题解 首先,我们发现操作不改变\(1\)的个数.所以可以先用前缀和判断\(1\)的个数是否相等. 如果某个字符串不出现相邻的两个\(1\),那么容易得到你无法做任何有效的操作,就直接判断是否相等.这一步可以用hash或sa或…
题解-Reachable Strings 前置知识: \(\texttt{Hash}\) Reachable Strings 给一个长度为 \(n\) 的 \(\texttt{01}\) 串 \(s\),可以让 \(s\) 中的 \(\texttt{110}\) 和 \(\texttt{011}\) 互相转换.\(q\) 次询问,每次给定两个 \(s\) 的子串 \(s_{l_1\sim l_1+len-1}\) 和 \(s_{l_2\sim l_2+len-1}\),问两个串是否可以互相变换得…
Content 我们定义一个字符串是合法的,当且仅当这个字符串是"连续排列"(按照字母表顺序排序).现在给出 \(n\) 个字符串 \(s_1,s_2,s_3,...,s_n\),判断它们是否合法. 数据范围:\(1\leqslant n\leqslant 100,|s_i|\leqslant 100\) 且 \(s_i\) 仅由小写英文字母组成. Solution 这道题目关键的一点就在于:给字符串排序.我在 CF975A的题解 中曾详细讲过如何用 \(\texttt{sort}\)…
http://poj.org/problem?id=2406 就是给一个串,求其循环节的个数. 稍微想一下就知道,KMP中nxt数组记录了所有可与前面匹配的位置. 那么如果我们的循环节长度为k,有n个,那么我们最后一个nxt显然就会是k*(n-1). 倒推即可. #include<cstdio> #include<cstring> using namespace std; ]; ]={}; void getnext(int m){ ; ;i<=m;i++){ &&am…
Analysis 结论:设字符串长度为n,最长相同前后缀的长度为kmp[i],如n%(n-kmp[n])=0,则答案为n/(n-kmp[n]),否则为1. 如果循环节多于一个,以前n-kmp[n]个为循环节,是可以铺满整串的.而且因为kmp[n]是尽量大的,所以这样得到的循环节长度为所有可能情况中最小的,也就是我们所求的. 而如果n%(n-kmp[n])≠0,可以认为之前的循环节匹配仍然可以进行,但是最后一个循环节被强行割掉了一些. #include<iostream> #include<…
题目链接:http://poj.org/problem?id=2406 题目大意:给你一个字符串 \(t\) ,\(t\) 可以表示为另一个小字符串循环了 \(K\) 了,求最大的循环次数 \(K\) . 题目分析:设字符串长度为 \(m\) ,如果 \(m-1-nxt[m-1]\) 能够整除 \(m\) ,则 \(K=m/(m-1-nxt[m-1])\) ,否则 \(K=1\) . 实现代码如下: #include <cstdio> #include <string> using…
Content 有一个长为 \(n\) 的字符串 \(q\),试问能否将其划分为 \(k\) 个子串,使得每个子串的首字母都不相等,可以的话输出 \(\texttt{YES}\) 并输出任意一个方案,否则输出 \(\texttt{NO}\). 数据范围:\(1\leqslant n\leqslant 100,1\leqslant k\leqslant 26\). Solution 我们可以考虑这样的一个流程: 输入字符串后,一个一个去扫. 如果有一个之前没有出现过的字母,就立刻建立新的一个空子串…
Content 有一个长度为 \(n\) 的仅含小写字母的字符串 \(s\) 以及 26 个英文小写字母的价值 \(W_\texttt{a},W_\texttt{b},...,W_\texttt{z}\),请求出在后面插入 \(k\) 个小写字母后所能够获得的最大价值. 对于一个长度为 \(x\) 的字符串 \(s'\),它的价值为 \(\sum\limits_{i=1}^x i\times W_{s'_i}\). 数据范围:\(1\leqslant n\leqslant 1000,0\leqs…
Content 我们有一个空的字符串,第 \(i\) 次操作我们可以将字母表中第 \(i\) 个字母加入字符串的最前面或最后面.我们称一个长度为 \(n\) 的字符串是合法的,当且仅当这个字符串可以通过执行 \(n\) 次上面的操作得到.现在给定 \(t\) 个字符串,求这些字符串是否合法. 数据范围:\(1\leqslant t\leqslant 10^4\),\(1\leqslant n\leqslant 26\). Solution 我们不妨弄两个指针,一个左指针,初始时指向第 \(1\)…
Content 有两个字符串 \(a,b\).我们每次操作可以将两个字符串中的一个字符串的最前面一个字符或这最后面一个字符删去(可以将某个字符串通过若干次操作变为空串).求需要多少次操作才能够使 \(a,b\) 两个字符串是相同的. 数据范围:\(t\) 组数据,\(1\leqslant t\leqslant 100\),\(1\leqslant |a|,|b|\leqslant 20\). Solution 我们发现只要你能够找到 \(a,b\) 两个字符串之间的公共部分,你就只需要去删这公共…
题面 [USACO12NOV]同时平衡线Concurrently Balanced Strings 题解 考虑DP. \(f[i]\)表示以\(i\)为左端点的合法区间个数.令\(pos[i]\)表示以\(i\)为左端点,最靠左的合法右端点. 那么有如下转移: \(f[i] = f[pos[i] + 1] + 1\). 1表示[i, pos[i]]这段合法区间,\(f[pos[i] + 1]\)表示在这段合法区间的基础上,还可以在后面拼接更多合法区间. 那么我们的目的就是求\(pos[i]\).…
Write a function to find the longest common prefix string amongst an array of strings. 题解: 寻找一组字符串的最长公共前缀.  最简单的方法,用一个字符串记录当前最长的公共前缀,然后依次比较.时间复杂度: O(N). class Solution { public: string getPrefix(string a,string b) // 辅助函数用于获取两个字符串的公共前缀 { string ans;…
Martian Strings 题解: 对于询问串, 我们可以从前往后先跑一遍exkmp. 然后在倒过来,从后往前跑一遍exkmp. 我们就可以记录下 对于每个正向匹配来说,最左边的点在哪里. 对于每个反向匹配来说,最右边的点在哪里. 然后判断可不可以构成这个串就好了. 代码: #include<bits/stdc++.h> using namespace std; #define Fopen freopen("_in.txt","r",stdin);…
第一次打虚拟赛. CF 传送门 T1:Contest for Robots 统计 \(r[i]=1\) 且 \(b[i]=0\) 的位数 \(t1\) 和 \(r[i]=0\) 且 \(b[i]=1\) 的位数 \(t2\). 两个数都为 \(0\) 或都为 \(1\) 时没有贡献. 若 \(t1=0\),则 \(r\) 序列不管乘多大的 \(p\) 也不会比 \(b\)序列更大,所以直接输出 \(-1\). 否则,我们考虑将 \(r[i]=0\) 且 \(b[i]=1\) 的位置的 \(p[i…
题目:Write a function to find the longest common prefix string amongst an array of strings. 题解:给出的函数为:char* longestCommonPrefix(char** strs, int strsSize) 其中参数char** strs表示字符串数字,int strsSize表示有多少个字符串 题目的要求就是在这strsSize个字符串中找出最长的公共前缀,例如strsSize=3,字符串如下图时…
题目: Write a function to find the longest common prefix string amongst an array of strings. 题解: 解题思路是,先对整个String数组预处理一下,求一个最小长度(最长前缀肯定不能大于最小长度). 然后以第0个字符串作为参照,从第1个字符串到最后一个字符串,对同一位置做判断,有不同字符串返回当前记录的字符串就行. 我的代码如下,不是那么简洁好看,下面有个整理的更好一些:                   …
原题链接在这里:https://leetcode.com/problems/longest-uncommon-subsequence-i/#/description 题目: Given a group of two strings, you need to find the longest uncommon subsequence of this group of two strings. The longest uncommon subsequence is defined as the lo…
Write a function to find the longest common prefix string amongst an array of strings. 题解:以strs[0]为模板,每次挨个查看是否所有的串里面是否第i位上都和strs[0]一样,如果都一样,把i位置上的字符放到answer里面,i++,继续循环,否则返回当前的answer. 代码如下: public class Solution { public String longestCommonPrefix(Str…
Write a function to find the longest common prefix string amongst an array of strings. 题解: 简单的暴力遍历解决 class Solution { public: string longestCommonPrefix(vector<string>& strs) { int n = strs.size(); || strs[].empty()) return ""; string…
BFS基础 广度优先搜索(Breadth First Search)用于按离始节点距离.由近到远渐次访问图的节点,可视化BFS 通常使用队列(queue)结构模拟BFS过程,关于queue见:算法与数据结构基础 - 队列(Queue) 最直观的BFS应用是图和树的遍历,其中图常用邻接表或矩阵表示,例如 LeetCode题目 690. Employee Importance: // LeetCode 690. Employee Importance/* class Employee { publi…
Hash Table基础 哈希表(Hash Table)是常用的数据结构,其运用哈希函数(hash function)实现映射,内部使用开放定址.拉链法等方式解决哈希冲突,使得读写时间复杂度平均为O(1). HashMap(std::unordered_map).HashSet(std::unordered_set)的原理与Hash Table一样,它们的用途广泛.用法灵活,接下来侧重于介绍它们的应用. 相关LeetCode题: 706. Design HashMap  题解  705. Des…
图基础 图(Graph)应用广泛,程序中可用邻接表和邻接矩阵表示图.依据不同维度,图可以分为有向图/无向图.有权图/无权图.连通图/非连通图.循环图/非循环图,有向图中的顶点具有入度/出度的概念. 面对图相关问题,第一步是将问题转为用图表示(邻接表/邻接矩阵),二是使用图相关算法求解. 相关LeetCode题: 997. Find the Town Judge  题解 1042. Flower Planting With No Adjacent  题解 图的遍历(DFS/BFS) 图的遍历/搜索…
  A - Journey Planning 题意: 有一列共 n 个城市, 每个城市有美丽值 b[i], 要访问一个子序列的城市, 这个子序列相邻项的原项数之差等于美丽值之差, 求最大的美丽值总和. 思路: 对于一个合法的子序列, b[i] - i 结果是一个定值, 统计该值取最大. view code #include <bits/stdc++.h> using namespace std; #define ll long long #define inc(i, l, r) for (in…
比赛链接:https://codeforces.com/contest/1437 A. Marketing Scheme 题解 令 \(l = \frac{a}{2}\),那么如果 \(r < a\),每个顾客都会买更多猫粮. 代码 #include <bits/stdc++.h> using namespace std; int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int t; cin >> t;…
Codeforces Round #543 Div1题解 Codeforces A. Diana and Liana 给定一个长度为\(m\)的序列,你可以从中删去不超过\(m-n*k\)个元素,剩下的元素从左往右每\(k\)个一组,最后一组可以不满.给定你一个大小为\(|S|\)的可重集,要求你分出的组中至少有一组构成的可重集包含了给定的可重集. 构造一种符合条件的删数方案. \(n,m,k,|S|\le 5*10^5\) 写了\(1h\)才过,感觉身败名裂. 考虑枚举一个右端点\(r\),显…
Codeforces Round #545 Div1 题解 来写题解啦QwQ 本来想上红的,结果没做出D.... A. Skyscrapers CF1137A 题意 给定一个\(n*m\)的网格,每个格子里都有一个数,对于任意一行和任意一列,要求把这\(n+m-1\)个数重新用正整数编号,并且对于这一行,数与数之间的大小关系不变,对于这一列同理.求出任意一行和任意一列编号使用的最大编号的最小值. 题解 读题读半天... 看懂了题目就不难了. 对于每一行和每一列先分别离散,记录每个位置在离散后的值…
Codeforces Round #539 Div1 题解 听说这场很适合上分QwQ 然而太晚了QaQ A. Sasha and a Bit of Relax 翻译 有一个长度为\(n\)的数组,问有多少个长度为偶数的连续区间,使得其前一半的异或和等于后一半的异或和. 题解 显然就是求长度为偶数且异或和为\(0\)的区间个数 求异或和为\(0\)的区间个数很简单,对于整个区间求异或前缀和看看有多少个相等就好了. 求长度为偶数的也很简单,把每个位置的异或前缀和按照位置的奇偶性分开求个数每次计算一下…
题面 ARC058D Iroha Loves Strings 给定 \(n\) 个字符串,从中选出若干个按给出顺序连接起来,总长等于 \(m\),求字典序最小的,保证有解. 数据范围:\(1\le n\le 2000\),\(1\le k\le 10^4\),字符串总长 \(S\le 10^6\). 题解 atcoder 的题就是好啊,非常巧妙,毫不毒瘤. 这篇题解要抨击 Z-function 怪 ycx,造福人民. 有一个非常显然的思路:每次选当前选了的串右边没选且能选的中最小的. 这里的能选…
题目来源 https://leetcode.com/problems/multiply-strings/ Given two numbers represented as strings, return multiplication of the numbers as a string. Note: The numbers can be arbitrarily large and are non-negative. 题意分析 Input: two numbers expressed as str…
题目描述 给定若干个长度小于等于10^6的字符串,询问每个字符串最多由多少个相同的子串重复连接而成.如:ababab,最多由3个ab连接而成. 输入输出格式 输入格式 若干行,每行一个字符串. 当读入到“.”时结束程序. 输出格式 若干行,为对应的答案. 输入输出样例 输入样例 abcd aaaa ababab . 输出样例 1 4 3 题解 这道题可以用字符串hash或kmp来做. 主要就是要将这道题转换成求最长前缀满足同为后缀. 假设在s[1...n]中,s[1...i]为前缀且s[n-i+…