L++

最长回文子序列和最长回文子串

断了今生、忘了曾经 提交于 2021-02-18 17:33:07
对于回文子序列,因为是不连续的肯定是不能直接枚举,那么利用动态规划。 我们可以知道对于任意字符串,如果头尾字符相同,那么字符串的最长子序列等于去掉首尾的字符串的最长子序列加上首尾;如果首尾字符不同,则最长子序列等于去掉头的字符串的最长子序列和去掉尾的字符串的最长子序列的较大者。那么转移方程:dp[i][j]=dp[i+1][j-1] + 2 if(s[i] == s[j]) dp[i][j]=max(dp[i+1][j],dp[i][j-1]) if (s[i] != s[j]) #include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> using namespace std; const int maxn= 1005 ; char s[maxn]; int dp[maxn][maxn]; int main() { scanf( " %s " ,s); int len= strlen(s); for ( int i=len- 1 ;i>= 0 ;i-- ) { dp[i][i] = 1 ; for ( int j=i+ 1 ;j<=len;j++ ) { if (s[i]== s[j]) dp[i][j] =dp[i+ 1 ][j- 1 ]+ 2 ;

leetcode-36-有效的数独

╄→гoц情女王★ 提交于 2021-02-16 18:40:06
题目描述: 判断一个 9x9 的数独是否有效。只需要根据以下规则,验证已经填入的数字是否有效即可。 数字 1-9 在每一行只能出现一次。 数字 1-9 在每一列只能出现一次。 数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。 上图是一个部分填充的有效的数独。 数独部分空格内已填入了数字,空白格用 '.' 表示。 示例 1: 输入: [ ["5","3",".",".","7",".",".",".","."], ["6",".",".","1","9","5",".",".","."], [".","9","8",".",".",".",".","6","."], ["8",".",".",".","6",".",".",".","3"], ["4",".",".","8",".","3",".",".","1"], ["7",".",".",".","2",".",".",".","6"], [".","6",".",".",".",".","2","8","."], [".",".",".","4","1","9",".",".","5"], [".",".",".",".","8",".",".","7","9"] ] 输出: true 示例 2: 输入: [ ["8","3",".",".","7",".",".",".","."], ["6",".",".

CF 293E Close Vertices——点分治

独自空忆成欢 提交于 2021-02-16 10:22:40
题目: http://codeforces.com/contest/293/problem/E 仍旧是点分治。用容斥,w的限制用排序+两个指针解决, l 的限制就用树状数组。有0的话就都+1,相对大小不变。 切勿每次memset!!!会T得不行。add(sta[ l ].len)即可,但要判一下(l==r)以防不测。(真的有那种数据!) 最后注意树状数组的范围是L(即L+1),不是n。不然可以尝试: 2 10 12 1 5 #include<iostream> #include <cstdio> #include <cstring> #include <algorithm> #define ll long long using namespace std; const int N=1e5+ 5 ; int n,L,W,hd[N],xnt,to[N<< 1 ],nxt[N<< 1 ],w[N<< 1 ]; int mn,rt,f[N],l,r,siz[N],lm; ll ans; bool vis[N]; struct Sta{ int w,len;Sta( int w= 0 , int l= 0 ):w(w),len(l) {} bool operator < ( const Sta &b) const { return w==b.w?len<b.len:w< b.w;} }sta

leetcode 128最长连续序列

你。 提交于 2021-02-15 07:00:59
方法一:使用快排: // 排序法,时间O(nlogn),使用STL,只是验证一下思想,非正解; class Solution { public : int longestConsecutive(vector< int >& nums) { sort(nums.begin(),nums.end()); int res= 0 ; for ( int i= 0 ;i<nums.size();i++ ){ int step= 0 ,len= 1 ; while (i+step!=nums.size()- 1 &&nums[i+step+ 1 ]-nums[i+step]<= 1 ){ if (nums[i+step]+ 1 ==nums[i+step+ 1 ]) len++ ; step ++ ; } res = max(res,len); i += step; } return res; } }; 方法二:使用并查集如题所说达到O(n) 方法三:使用哈希表O(n) // 哈希表结合染色,建立一个哈希表,然后遍历之后计数每个元素周围所有相邻元素并染色,记录个数;O(n)复杂度 class Solution { public : int longestConsecutive(vector< int >& nums) { int len= nums.size(); if (len<= 1 )

2019年湘潭大学程序设计竞赛(重现赛)

谁都会走 提交于 2021-02-13 05:03:21
https://ac.nowcoder.com/acm/contest/893#question A:签到1 #include<algorithm> #include <cstring> #include <iostream> #include <math.h> #include < string > #include <stdio.h> #include <map> #include <queue> #define ll long long #define inf 0x3f3f3f3f using namespace std; int n1,n2,p1,p2,s1,s2; int main() { while (cin>>n1>>p1>>s1>>n2>>p2>> s2) { if (n1> n2) printf( " 1\n " ); else if (n1< n2) printf( " 2\n " ); else { if (p1< p2) printf( " 1\n " ); else if (p1> p2) printf( " 2\n " ); else { if (s1< s2) printf( " 1\n " ); else if (s1> s2) printf( " 2\n " ); else printf( " God\n " ); } } } return 0 ;

Educational Codeforces Round 66 (Rated for Div. 2)

南楼画角 提交于 2021-02-11 20:35:36
要是有题目FST了就重新写 A 签到 #include<bits/stdc++.h> using namespace std; int T; long long n,k,ans; int main() { cin >> T; while (T-- ) { cin >>n>>k,ans= 0 ; while (n) { ans +=n% k; ans ++,n/= k; } cout <<ans- 1 << endl; } } View Code B 暴力模拟,记得打标记和开long long,注意特判 #include<bits/stdc++.h> using namespace std; typedef long long ll; const int N=1e5+ 7 ; int T,top; char str[ 101 ]; ll ans,st[N]; int main() { scanf( " %d " ,& T); st[ 0 ]= 1 ; while (T-- ) { scanf( " %s " ,str); if (str[ 0 ]== ' a ' ) { if (st[top]==- 1 )ans=- 1 ; else ans+= st[top]; if (st[top]==- 1 ||ans>=(1ll<< 32 )){puts( " OVERFLOW!!! " )

NTT模板

∥☆過路亽.° 提交于 2021-02-08 02:51:15
NTT(快速数论变换)用到的各种素数及原根: https://blog.csdn.net/hnust_xx/article/details/76572828 NTT多项式乘法模板 #include<cstdio> #include <iostream> #include <algorithm> using namespace std; typedef long long LL; const LL mod= 998244353 ; // 119*2^23+1 g=3 const int N=( 1 << 19 )+ 2 ; const int g= 3 ; int rev[N]; LL a[N],b[N]; template <typename T> void read(T & x) { x = 0 ; char c= getchar(); while (!isdigit(c)) c= getchar(); while (isdigit(c)) { x=x* 10 +c- ' 0 ' ; c= getchar(); } } LL Pow(LL a,LL b) { LL res = 1 ; for (;b;a=a*a%mod,b>>= 1 ) if (b& 1 ) res=res*a% mod; return res; } void NTT(LL *a, int n, int f) {

Go 实现字符串相似度计算函数 Levenshtein 和 SimilarText

て烟熏妆下的殇ゞ 提交于 2021-01-31 05:00:54
【转】 http://www.syyong.com/Go/Go-implements-the-string-similarity-calculation-function-Levenshtein-and-SimilarText.html levenshtein() 和 similar_text() 是 PHP 内置的两个字符串相似度计算函数。Levenshtein 计算两个字符串之间的编辑距离,SimilarText 计算两个字符串的相似度。下面使用Go分别实现二者。 Levenshtein // levenshtein() // costIns: Defines the cost of insertion. // costRep: Defines the cost of replacement. // costDel: Defines the cost of deletion. func Levenshtein(str1, str2 string , costIns, costRep, costDel int ) int { var maxLen = 255 l1 : = len(str1) l2 : = len(str2) if l1 == 0 { return l2 * costIns } if l2 == 0 { return l1 * costDel } if l1 >

LeetCode(42):接雨水

╄→尐↘猪︶ㄣ 提交于 2021-01-30 09:35:00
Hard! 题目描述: 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。 上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况下,可以接 6 个单位的雨水(蓝色部分表示雨水)。 感谢 Marcos 贡献此图。 示例: 输入: [0,1,0,2,1,0,1,3,2,1,2,1] 输出: 6 解题思路: 先来看一种方法,这种方法是基于动态规划Dynamic Programming的,我们维护一个一维的dp数组,这个DP算法需要遍历两遍数组,第一遍遍历dp[i]中存入i位置左边的最大值,然后开始第二遍遍历数组,第二次遍历时找右边最大值,然后和左边最大值比较取其中的较小值,然后跟当前值A[i]相比,如果大于当前值,则将差值存入结果。 C++解法一: 1 class Solution { 2 public : 3 int trap(vector< int >& height) { 4 int res = 0 , mx = 0 , n = height.size(); 5 vector< int > dp(n, 0 ); 6 for ( int i = 0 ; i < n; ++ i) { 7 dp[i] = mx; 8 mx = max(mx, height[i]); 9 } 10 mx = 0 ; 11

动画:一道 K Sum 面试题引发的血案

狂风中的少年 提交于 2021-01-22 13:01:45
每当我遇到一个难道,脑子里下意识出现的第一个想法就是干掉它。将复杂问题简单化,简单到不能再简单的地步,也是我文章一直追求的一点。 K Sum 求和问题这种题型套娃题,备受面试官喜爱,通过层层拷问,来考察你对事物的观察能力和解决能力,这似乎成为了每个面试官的习惯和套路。打败对手,首先要了解你的对手。 看似复杂的东西,背后其实就是简单的原理和机制,宇宙万物存在的事物亦是如此。深入复杂问题内部,去看它简单的运行逻辑。将繁杂嵌套事物转化为可用简单动画表现的事物。这是一个由繁变简的过程,简单,简而不单,又单而不简。 诱饵:2Sum 两数之和 捕鱼,先要学会布网,看似一个简单题目,其实作为诱饵,引申出背后的终极 Boss。 抛出诱饵: 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。 示例: 给定 nums = [2, 7, 11, 15], target = 9 因为 nums[0] + nums[1] = 2 + 7 = 9 所以返回 [0, 1] 大脑最先下意识想到的是,遍历所有数据,找出满足条件的这两个值,俗称暴力破解法。 解法一:暴力破解法 让目标值减去其中一个值,拿着差去数组中查找匹配是否存在,如果存在则返回下标。 /** * 解法一:暴力破解 * @param {number[]} nums *