题解 CF550A 【Two Substrings】】的更多相关文章

为什么我的做法跟别人如此不一样啊qwq 思路:暴力判每一个"BA"出现的位置,二分查找他前/后有没有满足条件的"AB",时间复杂度\(O(n\log_{2}n)\) # include <bits/stdc++.h> const int MaxN = 100010; std::vector<int> a, b;//存下标 int upper(int x)//二分后面的位置 { int l = 0, r = a.size(); while(l…
1.问题描述 2.问题分析 对于每一个字符,以该字符为中心计算回文个数. 3.代码 int countSubstrings(string s) { ; ) ; ; i < s.size(); i++){ count += checkPalindromic(s, i,i); count += checkPalindromic(s, i, i+); } return count ; } int checkPalindromic( string s ,int i ,int j ){ ; &&…
CF 1400F.x-prime Substrings 题意: 给定一个由\('1'\)到\('9'\)组成的字符串\(s\)和一个数\(x\),定义一个串为\(x-prime\)串,当且仅当这个串上的数字和为\(x\),且任意一个不等于本身的子串的和都不是\(x\)的因子,问最少删多少个数字可以使得串\(s\)的任何子串都不是\(x-prime\)串 \(1 \le |s| \le 1000,1 \le x \le 20\) 题解: 由于\(x\)很小,所以我们可以枚举所有\(x-prime\…
题意: 给两个串\(A.B\),问你长度\(>=k\)的有几对公共子串 思路: 先想一个朴素算法: 把\(B\)接在\(A\)后面,然后去跑后缀数组,得到\(height\)数组,那么直接\(rmq\)就能\(O(1)\)得到任意两个\(A\)和\(B\)的LCP.如果\(LCP >= k\),那么这个串的贡献对数为\(LCP - k + 1\).但是这样遍历显然超时. 那么我们可以用单调栈优化这个问题: 我们构建一个递增的单调栈,那么栈顶就是最大,每个栈里的元素为贡献值\(height\)的…
http://poj.org/problem?id=3415 给定两个字符串A 和B,求长度不小于k 的公共子串的个数(可以相同). 论文题,和上道题(POJ2774)类似,首先想到现将AB串合并,然后子串可以表示成字符串后缀的前缀,于是我们比较任意两个A后缀和B后缀,用height求出他们的公共子串长度就很好做了. (不懂为什么好做的可以看SPOJ694) 那么最坏的想法就是每遇到B后缀就和前面遇到的A后缀比较,这样显然TLE,也没用到height数组的优越性. 但是我们A后缀可以用单调栈维护…
https://www.codechef.com/problems/TSUBSTR https://vjudge.net/problem/CodeChef-TSUBSTR 给一棵点权为字母的树,你只能从任意节点往下走得到一个字符串,求出可得到的不重复字符串数量和其中字典序第k小的字符串(在重新定义字母的字典序前提下)? 垃圾谷歌翻译坑我不浅. 广义后缀自动机处理之后就是BZOJ3998:[TJOI2015]弦论t=0的解法了. 注意空字符串也算. #include<cstdio> #inclu…
https://www.luogu.org/problemnew/show/SP8222#sub http://www.spoj.com/problems/NSUBSTR/ 翻译来自洛谷. 你得到一个字符串,最多由25万个小写拉丁字母组成.我们将 F(x)定义为某些长度X的字符串在s中出现的最大次数,例如字符串'ababaf'- F(x),因为有一个字符串'ABA'出现两次.你的任务是输出 F(x)每一个I,以使1<=i<=|S|. water! 后缀自动机后对l排个序,对每个l更新其ans就…
https://vjudge.net/problem/SPOJ-DISUBSTR https://www.luogu.org/problemnew/show/SP694 http://www.spoj.com/problems/DISUBSTR/en/ 给定一个字符串,求不相同的子串的个数. 参考罗穗骞论文. 显然一个子串可以定义为一个后缀的前缀. 我们还可以求出来相邻排名的后缀之间的最长公共前缀的长度. 答案就是所有子串数量-所有height. (其实大胆猜想,不用证明即可(滑稽)) 说下原理…
题意: 问给定串有多少本质不同的子串? 思路: 子串必是某一后缀的前缀,假如是某一后缀\(sa[k]\),那么会有\(n - sa[k] + 1\)个前缀,但是其中有\(height[k]\)个和上一个重复,那么最终的贡献的新串为\(n - sa[k] + 1 - height[k]\).故最终结果为\(\sum_{i = 1}^n (n - sa[k] + 1 - height[k])\),即 \(\frac{n * (n + 1)}{2} - \sum_{i = 1}^nheight[k]\…
Content 有一个长度为 \(n\) 的数字串 \(s\),试求出代表偶数的子串个数. 数据范围:\(1\leqslant n\leqslant 65000\),\(s\) 仅包含数字 \(1\sim9\). Solution 众所周知,看一个数是否是偶数,只要看其最后一位是否能被 \(2\) 整除即可.所以,我们遍历一遍数字串,一旦碰见了能被 \(2\) 整除的数,那么假设其位置为 \(i\),那么显然,答案要增加 \(i\),因为这个数是偶数,那么前面连续的数组合起来的话也都是偶数.比如…