对称轴

22行代码AC——习题5-6 对称轴(Symmetry,UVa1595)——解题报告

谁说我不能喝 提交于 2020-03-12 10:35:47
励志用尽量少的代码做高效的表达。 题目(提交)链接→ UVa-1595 思路: 此题本质是一道笛卡尔坐标系上的对称性问题。 判定性问题:由于只要能判别图像是否左右对称即可,无需确认关于哪条垂直线对称,那么问题可以这样解决:将坐标升序排序后,若两侧坐标和都等于sum,再判断二者y值相同。就说明关于某条线对称。 最开始想到用 pair 结构体, p.first 存储x坐标, p.second 存储y坐标。重写 cmp() 函数,利用 sort() 对 pair 进行升序排序, (x1+x2)/2 求出 sum ,依次比较,若符合条件,则输出。 但这个想法是有bug的: 错误 :(x1+x2)/2可能是小数,而sum是int型,造成数据不准确。 解决办法:减法代替除法(坐标运算尽量避免除法),具体见代码第15行。 待优化 :用 set<pair<int,int>>s ; 代替 pair<int,int>p + sort() 。提高效率。 下面是优化后的代码: 代码: # include <bits/stdc++.h> using namespace std ; int main ( ) { int n ; cin >> n ; while ( n -- ) { int m , x , y ; cin >> m ; set < pair < int , int >> st ; int

leetcode-5:最长回文子串

倖福魔咒の 提交于 2020-02-08 13:33:23
leetcode-5:最长回文子串 解题思路 java 遍历字符串 length && 判断数组越界 substring() 解题思路 回文子串:左右对称 考虑对称轴为奇数(bab)和偶数(baab) 考虑边界情况:字符串长度为0,为1,首位,末位 优化: 对于一般情况,只需调用一次find函数,将返回值作为结果 对于特殊情况,需要分别以对称轴为奇数和偶数来计算,取最大结果 java 遍历字符串 .length(), charAt() for(int i=0;i < str.length();i++) { System.out.println(str.charAt(i)); } .length(), substring(i ,i+1) for(int i=0;i < str.length();i++) { System.out.println(str.substring(i,i+1)); } .toCharArray() char[] c = str.toCharArray(); for(int i=0;i < c.length;i++) { System.out.println(c[i]); } length 数组c长度:c.length 字符串s长度:s.length() && while((c[position-distant])&&(c[position+distant])

最长回文子串--力扣

吃可爱长大的小学妹 提交于 2020-01-10 04:10:33
5种解法: 1.最长公共子串 2.暴力法 3.动态规划 4.中心扩展法 5.Manacher法 以下记录大佬题解: 算法: 什么叫回文串? 如果一个字符串正着读和反着读是一样的,那它就是回文串。 中心扩展算法 我们观察到回文中心的两侧互为镜像。因此,回文可以从它的中心展开,并且只有 2n - 1 个这样的中心。 你可能会问,为什么会是 2n - 1 个,而不是 n 个中心? 因为回文的中心要区分单双。 假如回文的中心为 双数,例如 abba,那么可以划分为 ab bb ba,对于n长度的字符串,这样的划分有 n-1 种。 假为回文的中心为 单数,例如 abcd, 那么可以划分为 a b c d, 对于n长度的字符串,这样的划分有 n 种。 对于 n 长度的字符串,我们其实不知道它的回文串中心倒底是单数还是双数,所以我们要对这两种情况都做遍历,也就是 n+(n-1) = 2n - 1,所以时间复杂度为 O(n)。 当中心确定后,我们要围绕这个中心来扩展回文,那么最长的回文可能是整个字符串,所以时间复杂度为 O(n)。 所以总时间复杂度为 O(n^2) 代码如下: string longestPalindrome(string s) { if (s.length() < 1) { return ""; } int start = 0, end = 0; for (int i = 0;

[数学推导]对称轴

自古美人都是妖i 提交于 2019-12-11 17:10:38
源自校内模拟赛 Statement 求 \[(\sum_{i=0}^{p-1}\binom{2i}im^i)\bmod p\] \(1\le m<p\le 10^{14}\) , \(p\) 为质数 多组数据,数据组数不超过 \(10^4\) Solution 神仙题 一个转化: \[\binom{2n}n=\frac 1{(n!)^2}(\prod_{i=1}^n(2i-1))(\prod_{i=1}^n2i)=\frac{2^n}{n!}\prod_{i=1}^n(2i-1)\] 这看上去没什么用 但我们可 (bu) 以 (neng) 想到把 \(\prod\) 里面的每个数都取反后加上 \(p\) 再除以 \(2\) \[ans=\sum_{i=0}^{p-1}\frac{(2m)^i}{i!}\prod_{j=1}^i(2j-1)=\sum_{i=0}^{p-1}\frac{(-4m)^i}{i!}\prod_{j=1}^i(\frac{p+1}2-j)\] \[=\sum_{i=0}^{p-1}(-4m)^i\frac{\prod_{j=1}^i(\lfloor\frac p2\rfloor-j+1)}{i!}=\sum_{i=0}^{\lfloor\frac p2\rfloor}\binom{\lfloor\frac p2\rfloor}i(-4m)^i=(1-4m)^

BZOJ3160 万径人踪灭

自古美人都是妖i 提交于 2019-12-05 10:43:06
给定一个长度为 $n$ 的 01 串 $s$,求它的非连续回文子串的数量。 题目链接 首先考虑如何求连续回文子串的数量。 一种可行的方法是使用 Manacher 算法,它设计的初衷是用于求最长回文子串,但在实现的过程中,它求出了一个数组 $R_i$ 代表将原串每两个相邻的字符中间插入分隔符 ‘#’ 之后,以位置 $i$ 为对称轴的最长对称长度,这就意味着以 $i$ 为对称轴有一共有 $leftlfloorfrac {R_i}2 rightrfloor$ 个回文串。这一步的时间复杂度为 $O(N)$. 接下来考虑如何求回文子串的数量。 假定有一个回文子串对称轴为 $i$, 那么这个子串上的任何两个对应的字符 $u,v$ 的下标 $u_p,v_p$ 一定满足 $u_p+v_p=2i$. 如果我们能够求得一个数组 $f$, 其中 $f_i$ 代表有多少对字符关于 $i$ 对称,那么 $i$ 这个对称轴对答案的贡献就是 $2^{f_i}-1$, 因为每对字符都有选和不选两种选择,最终减去空串。 我们在求多项式的卷积的时候,公式为 $C_i=sum_{j+k=i}A_jB_k$, 与此处的情形非常相似,我们处理一个数组 $a$, 其中 $a_i=[s_i=a]$. 然后求 $a$ 和自己的卷积,然后再处理一个数组 $b$, 其中 $b_i=[s_i=b]$. 然后求 $b$ 和自己的卷积

最大回文子串manacher算法python

亡梦爱人 提交于 2019-12-04 20:16:07
关于最大回文子串问题,有两种处理方法: 1.以每个字符为中心,向两边寻找回文子串,遍历整个数组后,返回最长的。 该方法时间复杂度较大为o(n^2) 2.一个中等难度的动态规划算法:马拉车 step1:给每个字符左右都加上特殊字符比如'#',处理后,能使字符串s长度为奇 step2:现在的问题变成如何高效求得RL数组 定义:RL:是一个回文半径数组 RL[i]:以第i个字符为对称轴的回文半径 maxRight:当前访问到的所有回文串中最右边的字符位置 Pos:maxRight对应回文串的对称轴所在位置 i:第i个字符 j:i关于pos的对称点 (1):i在maxright右边:就是说以i为对称轴的回文串还没被访问。 这时,以i为中心向两边扩展,当达到边界or字符不相等时停止。 (2):i在maxright左边:扫到了一部分以i为对称轴的子串。 这时,令以i为对称轴的回文半径RL【i】=min(RL[j],maxright-i) 然后再以i为中心向两边扩展,直到左!=右且到达边界 最后更新maxright=max(maxright,RL[i]+i-1)且若maxright变,Pos会变为Pos=i 很抽象,上代码: # -*- coding:utf-8 -*- #@author:xinxinzhang def manacher(s): s='#'+'#'.join(s)+'#'

最长回文子串——Manacher 算法

一个人想着一个人 提交于 2019-12-04 20:15:50
原文网址: https://segmentfault.com/a/1190000003914228 0. 问题定义 最长回文子串问题:给定一个字符串,求它的最长回文子串长度。 如果一个字符串正着读和反着读是一样的,那它就是回文串。下面是一些回文串的实例: 12321 a aba abba aaaa tattarrattat(牛津英语词典中最长的回文单词) 1. Brute-force 解法 对于最长回文子串问题,最简单粗暴的办法是:找到字符串的所有子串,遍历每一个子串以验证它们是否为回文串。一个子串由子串的起点和终点确定,因此对于一个长度为n的字符串,共有n^2个子串。这些子串的平均长度大约是n/2,因此这个解法的时间复杂度是O(n^3)。 2. 改进的方法 显然所有的回文串都是对称的。长度为奇数回文串以最中间字符的位置为对称轴左右对称,而长度为偶数的回文串的对称轴在中间两个字符之间的空隙。可否利用这种对称性来提高算法效率呢?答案是肯定的。我们知道整个字符串中的所有字符,以及字符间的空隙,都可能是某个回文子串的对称轴位置。可以遍历这些位置,在每个位置上同时向左和向右扩展,直到左右两边的字符不同,或者达到边界。对于一个长度为n的字符串,这样的位置一共有n+n-1=2n-1个,在每个位置上平均大约要进行n/4次字符比较,于是此算法的时间复杂度是O(n^2)。 3. Manacher

暑假训练idea汇总

爱⌒轻易说出口 提交于 2019-11-27 21:13:55
AFO时间过长导致看什么都觉得新鲜……暑假训练主要就是打一打hdu和nowcoder的多校,题目没什么好保密的。因为没有部分分可能并不适合学弟学妹们练习,不过有些idea还是很有意思的,当作课余消遣大约不错。思维能力很强的oier想必头脑中都有很多妙趣横生的模型吧?没有用公式题解果然不美观qwq 7.22 CF1189 A1 Add on a Tree 简要题意:给定一棵树,每次选两个叶子,给它们之间的路径上的边加任意实数权。现在假设这棵树每个边都有一个随机边权,问按上述规则是否存在构造方案。要求线性复杂度。 简 要题解: 度为 2 的点所连的两边必须相同,所以判度数即可。对于其他情况均可在子树中调整,充分性同样可证。 CF1189 A2 Add on a Tree:Revolution 简要题意:把前一题中的实数权改为正整数,规定每条边的边权,给出一个构造方案。要求线性复杂度。 简要题解: 按照 dfs 序构造,关键在于怎样消除上面操作对已经完成部分的影响。将一个叶子节点设为根,其他叶子节点直接向根连要求权值的边。对于非叶子节点,选取子树中两个叶子之间连(出权-入权)/2,再由两个叶子分别向根连边,即可满足当前要求并且不破坏之前构造。过程中出现了小数或上一题中矛盾即为无解,算法题往往把一个整体问题“分步处理”,尽可能消除后效性才可以得到满意的复杂度。 7.25 2019牛客多校3