字符串
sunnyorrainy
这个作者很懒,什么都没留下…
展开
-
字符的最少变换次数,并查集
题意:给两个字符串a, b。a合和b中的字符都是前20个字母(a~t),a需要进行一些变换,使得a等于b。对于每一次变换:选取a中相同的字符,然后把它们用同一个字符替换,并且替换的字符必须比原来的字符大。问最少需要多少次操作,才能使得a等于b?如果不能相等,输出-1.题目链接题解:很容易想到,a中只要有一个对应的字符比b大,那么就直接输出-1。这个题应该用并查集做,或者是贪心。反正只要20个字母,都是从一种字母变换到另一种字母。那么就把字母连接起来, 让它们的父节点相同,表示原创 2020-12-19 15:33:31 · 590 阅读 · 1 评论 -
插入最少的字符,构造回文串
题目:题目链接给一个字符串,在任意的位置插入一些字符,使得这个字符串成为回文串,最少需要插入多少个字符。ps:有一个和这个题很像的题,都是插入最少的字符构造回文串, 但那个题是在字符串的尾部或者头部插入,而不是任意的位置。那个题可以用kmp做,也可以用马拉车做。以前写过在任意的位置插入,就是把这个字符串反转,求反转的和原来的字符串 最长公共子序列。然后答案就是长度减去LCSdp求LCS#pragma warning(disable:4996)#include<iostrea原创 2020-11-12 21:34:37 · 1408 阅读 · 0 评论 -
求两个字符串的LCS(最长公共子串)后缀数组
题意:给两个字符串,求出它们的最长公共子串的长度。比如yeshowmuchiloveyoumydearmotherreallyicannotbelieveityeaphowmuchiloveyoumydearmother它们的最长公共子串为howmuchiloveyoumydearmother,一共有27个字符。题解:没有什么好说的,后缀数组模板题,会求后缀数组sa和height数组就行。height[i]是排名为i的后缀和排名为i-1的后缀的最长公共前缀。那么只需要找.原创 2020-10-26 11:01:03 · 518 阅读 · 0 评论 -
C++ 小知识
1.输入一串空格隔开的单词,必须要用string的时候,用getline输入,然后把它们分开。方法:istringstream函数#include<sstream>//istringstream函数的头文件vector<string>s1, s2, s3;string str1, str2, temp; getline(cin, str1); getline(cin, str2);//读入 istringstream Str1(str1), Str2(str.原创 2020-10-03 11:54:56 · 384 阅读 · 0 评论 -
c++ String插入字符,结构体排序
题意:题目链接洛谷的一个后缀数组模板题,就是对一个字符串的所有后缀进行排序。思路:我的错误方法,MLE了,正确的应该就是用后缀数组做,写个模板就行。我想的是用String把所有后缀写出来,使用insert(pos, num, chr)(位置,个数,字符)函数插入字符,好像这样才不会re,也许有其他更好的方法。然后,定义cmp函数,对结构体数组排序。#pragma warning(disable:4996)#include<iostream>#include&l.原创 2020-07-13 09:46:00 · 375 阅读 · 0 评论 -
构造最长回文串
题意: 有n个长度为m的字符串, 把它们拼接在一起, 输出可能的最长回文串。题目链接思路: 用map记录字符串的个数,使用reverse函数得到它翻转之后的字符串,如果有反转后的字符串,就把它在最前拼面和最后面拼接上。用string的‘+’运算进行拼接。如果是单独的一个字符串,但是它是回文的,就把已经得到的字符串分成两半,还是要用string的'+"运算,因为确定长度的string访问下标会出错。#pragma warning(disable:4996)#incl...原创 2020-05-31 21:56:42 · 405 阅读 · 0 评论 -
字符串子序列得到另一个字符串
题意: 一个字符串s,一个字符串t,长度小于等于1e5, 还有一个空字符串z,每次从s中取出s的一些子序列。然后把它们加入到z中。求使得z和t相同的最小的操作次数。如果不能使z和t相同。输出-1。题目链接思路: 用vector的数组,来保存二十六个字母在s中出现的位置。也就是把位置加入到相应的数组中,用ascii码来表示字母。这样就可以访问下标了。然后遍历t字符串,对于每个字母,用二分查找位置。(同时记录上一个字母的位置,当前的位置不能比上一个字母的位置小,因为子序列顺序不能乱...原创 2020-05-29 17:16:24 · 374 阅读 · 0 评论 -
交换字符,codeforces1015B
题意:给两个字符串,s,t需要把他们变成一样的。对于字符串s,可以让它的两个相邻字符s[i],s[i+1]交换(1<=i<n)。不需要让操作次数最少,但是操作的次数不能超过1e4求一种方案。如果s和t永远无法相等就输出-1输出操作次数以及每次发生交换的位置i.题解:对于t的每个字符,如果和s对应的位置的字符一样就不需要交换。如果不一样,就需要往后面查找,如果查找不到,就...原创 2020-02-22 20:29:30 · 451 阅读 · 0 评论 -
acwing 158 项链 字符串的最小表示 模板
两个字符串,判断它们是不是同构的,如果同构,输出最小表示。最小表示法模板题。#pragma warning(disable:4996)#include<iostream>#include<cstdio>#include<stack>#include<queue>#include<map>#include<cst...原创 2019-12-31 20:55:49 · 138 阅读 · 2 评论 -
acwing 151表达式求值(模拟)
这个题就是给一个中缀表达式(普通算式)有+-*/和^(乘方)五种运算,而且有负数。思路:先把中缀表达式转化为后缀表达式,然后根据后缀表达式,利用栈求值。(首先要知道后缀表达式求法和用法)把中缀转化为后缀时,如果是数字就直接写,如果有左括号就把左括号加入栈,如果遇到运算符也加入栈,遇到了右括号时,把左右括号之间的运算符全部pop,并加入后缀表达式,然后一定要把左括号pop,因为左括号运算优先...原创 2019-12-19 21:30:30 · 318 阅读 · 0 评论 -
codeforces1203A关于循环移位的问题,字符串匹配
题意:n个数字组成的排列,问它们能不能通过循环移位形成1 2 3...n的序列或者是n...3 2 1 的序列。比如2 3 4 5 1 和3 2 1 4 就可以,但是1 2 3 5 4 就不行。题的链接对于这种问题可以两个for循环从前往后,再从后往前,直接暴力找,找到了一个就行,没有就不行。但是这样要考虑很多东西。#include<iostream>#includ...原创 2019-12-04 17:00:47 · 168 阅读 · 0 评论 -
codeforces909d 字符串模拟
题意:有一个字符串,如果一个字符和它相邻的字符是不同的话,就把它们都消除,问最多能进行几次操作。如aabb,能进行2次操作。题题解:先把相邻的同一种字符和它的个数数出来。然后进行模拟。每次模拟后,再进行合并。#pragma warning(disable:4996)#include<iostream>#include<cstdio>#include<...原创 2019-12-02 15:35:52 · 204 阅读 · 0 评论