\(C_n^m\)的typora,点了一下启用源代码模式就把我已经写好的博客弄没了,就给我留个标题,自动保存也只给我保存了个标题……\(C_n^m\),wdnmd

- Time limit
1000 ms

  • Memory limit

    262144 kB

解题思路

KMP

打比赛的时候愣是想不到怎么用KMP,总想着如果用kmp,那么每次合并都要更新nxt数组,会被卡到n方,就是想不到老字符串不用每次都全体参与KMP,每次只需要把老字符串后面那段拿出来判断就行了……还想着是不是要用啥我现在还不会的高级玩意……对KMP的理解只停留在做最裸的那种板题……

KMP有两种玩法,目的都是在合并老字符串(之前合并的结果)和新字符串(最新读入的)的时候找出可以被合并的长度,然后就能把新字符串后面那截不能合并的接到老字符串后面。边写边骂typora。由于合并的时候,老字符串和新字符串重复的长度小于等于新字符串的长度,所以处理的时候都截取老字符串后面和新字符串等长的一截(如果新字符串比老字符串长,那么就选整个老字符串)

一种是官方题解的思路——先把新字符串放前面,把“老字符串的后面一截”放后面,然后对于这个新接的合体字符串跑一遍KMP,求出nxt数组,以便找到最长的border(这个是nxt数组的定义了),这个就是可以合并的长度了,当然这个值要是大于了读入的新字符串或者之前合并出来的老字符串的长度,就要取“最长border长度、读入的新字符串的长度、之前合并的老字符串的长度”这三者的最小值,因为合并两个字符串最多就是一个把另一个吞并了,长度不会小于两个字符串中的任意一个。

另一种思路来自这篇博客——每次读入新字符串以后,把新字符串作为模式串,把老字符串的后面那截作为文本串。然后就跑几乎是裸的KMP了——先求出新字符串的nxt数组,然后用新字符串去匹配文本串(老字符串的后面那截),如果匹配的时候文本串的指针跑到头了,那么现在这个模式串指针指向的字符就是合并后新字符串贡献的第一个字符。如果文本串指针还没跑到头,模式串指针跑到头了,那么说明新字符串合并上去以后就啥都不剩了,完全被老字符串吞并了。这两种情况,都可以返回模式串指针的位置。这个位置一直到新字符串末尾这段就是要新加的了。

另外,KMP各种写法导致的指针加一减一的问题,微调一下就好了。

哈希

快速求几个子串的哈希值的方法,貌似NOI2016、2017连着考了两年,其他时候也用得不少,但我至今还没填坑……再次留坑。扔个链接先跑了。

源代码

#include<cstdio>
#include<cstring>
#include<algorithm>
const int MAXN=1e6+5;
int n;
char a[MAXN],b[MAXN];
int nxt[MAXN];
int lena,lenb;
int kmp(int st)//传入模式串的匹配起点
{
int i,j;
nxt[0]=-1;
for(i=1,j=-1;i<lenb;i++)
{
while(~j&&b[i]!=b[j+1]) j=nxt[j];
if(b[i]==b[j+1]) j++;
nxt[i]=j;
}
// for(int x=0;x<lenb;x++) printf("%d ",nxt[x]);
// puts(b);
for(i=st,j=-1;i<lena;i++)
{
while(~j&&b[j+1]!=a[i]) j=nxt[j];
if(a[i]==b[j+1]) j++;
if(j==lenb-1) return lenb;
}
return j+1;
} int main()
{
//freopen("test.in","r",stdin);
scanf("%d%s",&n,a);
lena=strlen(a);
n--;
while(n--)
{
scanf("%s",b);
lenb=strlen(b);
int temp=kmp(std::max(0,lena-lenb));
// printf("%d\n",temp);
for(int i=temp;i<lenb;i++)
a[lena++]=b[i];
}
a[lena]=0;
puts(a);
return 0;
}

这场CF的F题听说是什么基环树,太难了(借口),留坑,不补了

CodeForces 1200E Compress Words的更多相关文章

  1. [kmp,不要过多调用strlen!!!] Codeforces 1200E Compress Words

    题目:http://codeforces.com/contest/1200/problem/E Compress Words time limit per test 1 second memory l ...

  2. codeforces#1120C. Compress String(dp+后缀自动机)

    题目链接: https://codeforces.com/contest/1120/problem/C 题意: 从前往后压缩一段字符串 有两种操作: 1.对于单个字符,压缩它花费$a$ 2.对于末尾一 ...

  3. Codeforces 1120C Compress String(DP)

    题意:给你一个字符串,有2种消除方式:1:消除一个单独的字母,代价为a.2:s[j]到s[k]是s[1]到s[j - 1]的子串,那么s[j]到s[k]可以消除,代价为b,问最小的代价. 思路:官方题 ...

  4. 【Codeforces 1120C】Compress String

    Codeforces 1120 C 题意:给一个串\(S\),将这个串分成\(t_1..t_m\),如果\(t_i\)在\(t_1..t_{i-1}\)中作为子串出现过,那么这个的代价是\(b\),否 ...

  5. KMP(next数组的更新理解)Codeforces Round #578 (Div. 2)--Compress Words

    题目链接:https://codeforc.es/contest/1200/problem/E 题意: 有n串字符串,让你连起来:sample please ease in out   ---> ...

  6. Codeforces Round #578 (Div. 2) E. Compress Words (双哈希)

    题目:https://codeforc.es/contest/1200/problem/E 题意:给你n个单词,你需要把他合成成一个句子,相邻的两个单词,相邻部分相同的话可以把其中一个的删掉 思路:因 ...

  7. Codeforces Round #543 Div1题解(并不全)

    Codeforces Round #543 Div1题解 Codeforces A. Diana and Liana 给定一个长度为\(m\)的序列,你可以从中删去不超过\(m-n*k\)个元素,剩下 ...

  8. Codeforces Round #539&#542&#543&#545 (Div. 1) 简要题解

    Codeforces Round #539 (Div. 1) A. Sasha and a Bit of Relax description 给一个序列\(a_i\),求有多少长度为偶数的区间\([l ...

  9. Codeforces Round #345 (Div. 1) C. Table Compression dp+并查集

    题目链接: http://codeforces.com/problemset/problem/650/C C. Table Compression time limit per test4 secon ...

随机推荐

  1. Anaconda配置环境变量+创建虚拟环境+pycharm使用虚拟环境

    Anaconda配置环境变量+创建虚拟环境 配置环境变量 没有添加系统变量,所有系统根本识别不了conda命令,找不到位置,所以添加以下系统变量: 添加对应Anaconda环境变量:(以自己的安装路径 ...

  2. $Prufer$序列

    \(Prufer\)序列 \(Prufer\)序列与树的相互转换: 树->\(Prufer\)序列 找到一个编号最小的叶子结点,把这个点删掉并且把跟他连着的那个点的编号加入\(Prufer\)序 ...

  3. Vue.js路由管理器 Vue Router

    起步 HTML <script src="https://unpkg.com/vue/dist/vue.js"></script> <script s ...

  4. 使用 tablib 来自动化管理测试用例,其他的工具都不用学了

    你在学习 python 自动化测试吗?听过 requests 库吗?tablib 是 requests 库作者常年维护的一个可以操作 Excel 等多种文件格式,将他们变成一种通用数据集的第三方库. ...

  5. Jquery复习(八)之遍历

    jQuery 遍历 - 祖先 parent() parents() parentsUntil() jQuery parent() 方法 parent() 方法返回被选元素的直接父元素. 该方法只会向上 ...

  6. 普通交叉验证(OCV)和广义交叉验证(GCV)

    普通交叉验证OCV OCV是由Allen(1974)在回归背景下提出的,之后Wahba和Wold(1975)在讨论 了确定多项式回归中多项式次数的背景,在光滑样条背景下提出OCV. Craven和Wa ...

  7. Mysql数据库中的输入命令各类知识总结

    1.链接数据库的命令---mysql-u root-p 回车,输入密码//在cmd上输入自己的账号密码 2.查看:show databases: 3.创建数据库:create +database+数据 ...

  8. git 本地tag和远程tag对应不上 vscode里pull不下代码

    vscode拉取代码是用  git pull --tags origin saas-xxx > git pull --tags origin saas-base From 172.16.0.xx ...

  9. git 计算commit

    转自:https://www.cnblogs.com/jwentest/p/8186712.html#!/bin/bash f1="$1*" f2="$2*" ...

  10. js 动态生成表格案例

    <1>布局:一个table表格,表格分为两个部分,上面是thead表头,表头里面仅一行,有4列(th),   下面是tbody表格内容,要求tbody中的每一行都是用js动态创建的 < ...