【FJOI2016】所有公共子序列问题

关于求解所有最长公共子序列的思路 没有最好的解法,只有更好的解法 一、题目描述 求取两个给定序列的最长子序列( 需要求解出所有的最长公共子序列 )。 比如序列 X 为 ABCBDAB ,序列 Y 为 BDCABA,则其公共最长子序列之一为 BCBA( 可能不唯一 )。 二、解题思路 时隔几日,我又再次回到了这道题,如果看过我之前文章的朋友应该知道我前几天写过一篇关于求解最长公共子序列的文章,但是当时的要求就是只需求解... 阅读详情

内存限制:256 MiB 时间限制:1000 ms

问题描述

引用块内容

输入格式

引用块内容

输出格式

引用块内容

样例输入 1

6 6
GCTACT
GATCCT
1

样例输出 1

A
AC
ACT
ATC
CC
CCT
CTG
GA
GAC
GACT
GAT
GC
GCC
GCCT
GCT
GT
GTC
GTCT
GTTT
TC
TCT
TT
26

样例输入 2

10 10
FRWMQJBFMW
AFBZOMWSIJ
1

样例输出 2

B
BM
BMW
BW
F
FB
FBM
FBMW
FBW
FJ
FM
FMJ
FMW
FW
FWJ
J
M
MJ
MW
W
WJ
22

提示

1≤m,n≤3010 答案….很大啦

题解

序列自动机板题。对字符串X,YX,Y分别建机子,在两个机子上同时跑爆搜就可以了(记忆化优化一下),要输出字符串的话边搜边输出就行了(这时不能记忆化)。注意大数据会用到高精度,而且要压位避免爆空间……

代码

#include<stdio.h>
#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cmath>
using namespace std;
int n,m,k,id[200];
char a[3015],b[3015],s[3015],pre[60];
bool flag[3015][3015];
struct segAM
{
    int Next[3015][60],Last[60],par[3015],tot,rt;
    segAM()
    {
        tot=rt=1;
        for(int i=0;i<60;i++) Last[i]=rt;
    }
    void insert(char c)
    {
        int p=id[c];
        par[++tot]=Last[p];
        for(int i=0;i<52;i++)
            for(int j=Last[i];j&&!Next[j][p];j=par[j]) Next[j][p]=tot;
        Last[p]=tot;
    }
}tra,trb;
struct Biginteger
{
    int num[21],len;
    void operator += (const Biginteger &x)
    {
        len=max(len,x.len);
        for(int i=0;i<len;i++)
        {
            num[i]+=x.num[i];
            num[i+1]+=(num[i]>=1e9);
            num[i]-=(num[i]>=1e9)?1e9:0;
        }
        if(num[len]) len++;
    }
    void output()
    {
        printf("%d",num[len-1]);
        for(int i=len-2;i>=0;i--) printf("%09d",num[i]);
        puts("");
    }
}f[3015][3015],one,zero;
void getstr(int x,int y,int z)
{
    if(!x||!y) return;
    s[z]=0,printf("%s\n",s);
    for(int i=0;i<60;i++) s[z]=pre[i],getstr(tra.Next[x][i],trb.Next[y][i],z+1);
}
Biginteger getans(int x,int y)
{
    if(!x||!y) return zero;
    if(flag[x][y]) return f[x][y];
    flag[x][y]=true,f[x][y]+=one;
    for(int i=0;i<60;i++) f[x][y]+=getans(tra.Next[x][i],trb.Next[y][i]);
    return f[x][y];
}
int main()
{
    for(int i=0,j='A';i<26;i++,j++) id[j]=i,pre[i]=j;
    for(int i=26,j='a';i<52;i++,j++) id[j]=i,pre[i]=j;
    one.len=1,one.num[0]++,zero.len=1,zero.num[0]=0;
    scanf("%d%d%s%s%d",&n,&m,a,b,&k);
    for(int i=0;i<n;i++) tra.insert(a[i]);
    for(int i=0;i<m;i++) trb.insert(b[i]);
    if(k) getstr(1,1,0);
    getans(1,1);
    f[1][1].output();
    return 0;
}
FJOI 2016 所有公共子序列问题(序列自动机+dp) 【FJOI2016】所有公共子序列问题 问题描述 输入格式 输出格式 样例输入 6 6 GCTACT GATCCT 1 样例输出 A AC ACT ATC CC CCT CTG GA GAC GACT GAT GC GCC GCCT GCT GT 阅读详情

相关推荐

找出所有最长公共子序列算法代码

所有最长公共子序列(LCS)——动态规划——Java---所有!!!所有!!!所有!!!

【动态规划】输出两个序列的所有的最长公共子序列(java)

要解决的问题就是如何找出两个序列的全部公共子序列。

shixixiya6的博客 4881

公共子序列-查找两个字符序列的所有公共子序列

查找两个字符序列的公共子序列,查找到的是两个字符串的所有公共子序列。

求所有最大公共子序列的算法实现

最近看了很多关于LCS(Longestcommonsubsequenceproblem,最长公共子序列)的文章,大部分问题都只是求出最大公共子序列的长度,或者打印处其中的任意一个最大子序列即可,但是如何快速的打印出所有的最大长度子序列?这个问题好像看到的不多。本文给出了传统的DP(dynamicprogramming,动态规划)算法进行求解的过程,并用c语言实现。另外参考一篇论文实现了其中...

weixin_30654419的博客 400

【python】epub的电子书繁体字与简体字转换

中文繁体与简体转换

xiexianyou666的博客 3090

Ubuntu22.04下安装LDAP

在Ubuntu22.04的时候可以使用apt的方式来安装,在安装LDAP的web 服务器的时候可以考虑选择 LDAP 帐户管理器 (LAM)。因为 PHPLDAPadmin 安装时需要 php 的环境依赖,相对来说安装麻烦。此外在 PHPLDAPadmin 中创建组织和用户时与平常的语法有很大不同,对新手来说不友好。

dl_11的博客 3944

公共子序列

本文内容参考如下: 【1】 https://blog.youkuaiyun.com/lyy289065406/article/details/78702485; 【2】《算法导论》第3版 15.4节 最长公共子序列(longest common sequence):即一个给定的序列的子序列,就是将给定序列中零个或多个元素去掉之后得到的结果。 和最长公共子串(longest common substring):给定串中任意个连续的字符组成的子序列称为该串的子串。、 给一个图再解释一下: 2.动态规划 求解LCS问题,

weixin_44368514的博客 3659

基于Arduino 的 FM 调频收音机

这是一个基于 Arduino 的开源的收音机项目,它具备一台标准收音机的全部功能,从控制部分到外壳都可以自己 DIY。在项目中,我们将介绍让 FM 收音机调谐器的 RDA5807 模块与 I2C 协议进行通信的方法,整个过程只需要两根线就可以与 IC 通信,接线非常简单。3D 打印的外壳也非常简洁。总之,是个非常简单和实用的项目,来试试吧!

ByteBox的博客 1643

FJOI2019全记录(福建省选)

Day 0 最后一个早上,早读完后就到机房里,复习了左偏树和计算几何,然后真的不知道还要做什么了(FFT和一些数论的结论昨天复习过了 也许还要去学一点新东西(?),像Krusk重构树什么的。(一直没有学过 等一下十一点多就要出发去动车站前往福州了(老师居然买了中午一点半的动车) 愉快地跑来写博客。 “最后这几个单位时间很重要,你们要能及时查缺补漏,使自己达到一...

474

在没有信用卡的情况下怎么申请谷歌云(Google Cloud)?

这笔额度足够用来跑一台云服务器、部署小型网站,甚至可以尝试 AI、机器学习等项目。但问题来了——想要拿到这 300 美元,你必须先通过支付方式验证。默认选项就是绑定一张国际信用卡(Visa、MasterCard 之类),然而不少人没有信用卡,或者信用卡无法支持国际支付,结果就卡在注册第一步。很多人会疑惑:既然是送额度,为什么还要绑卡?原因其实很简单:谷歌需要确认你是真实用户,而不是批量注册薅羊毛;通过支付验证,后续如果你用完 300 美元额度,可以直接进行付费使用;

m0_74824483的博客 5659

飞塔防火墙CVE-2022-40684漏洞复现:手把手教你搭建靶场环境(附调试技巧)

本文详细指导如何搭建Fortinet飞塔防火墙CVE-2022-40684认证绕过漏洞的靶场环境,涵盖虚拟机部署、网络配置、调试模式开启及漏洞原理分析。通过手把手教程,读者可掌握漏洞复现与深度调试技巧,深入理解该认证绕过漏洞的利用与防御。

h6i7j8的博客 695

luogu4608 [FJOI2016]所有公共子序列问题

题目描述: luogu loj 题解: 序列自动机(?)+高精+普及dp。 这个是猫老师的序列自动机(字符串从1开始): void sol(char *s,int n,int t[N][53]) { memset(t[n],-1,sizeof(t[n])); for(int i=n-1;i>=0;i--) { m...

weixin_30781631的博客 95

保姆级教程:手把手教你用CANoe/CANalyzer读取汽车故障码(UDS 0x19服务实战)

本文提供了一份详细的CANoe/CANalyzer使用教程,指导如何通过UDS 0x19服务读取汽车故障码。从硬件配置到报文构建,再到故障码解析,手把手教你完成汽车诊断全流程,特别适合汽车电子工程师和诊断开发人员。

weixin_42524945的博客 261

序列自动机—— [FJOI2016]所有公共子序列问题

序列自动机: 是一个处理子序列的自动机。就这样。 建造:(By猫老师:immoralCO猫) s[] next[][26] memset(next[n], -1, 26<<2); for(int i = n; i; --i) { memcpy(next[i - 1], next[i], 26 << 2); next[i - 1][s[i]...

weixin_34014277的博客 163

解决VM 与 Device/Credential Guard 不兼容。在禁用 Device/Credential Guard 后,可以运行 VM 的方法

在启用了Credential Guard或Device Guard的Windows 10主机上启动12.5版之前的VMware Workstation中的虚拟机时,将显示蓝色诊断屏幕(BSOD)。 会看到类似于以下内容的错误: VMware Workstation和Device / Credential Guard不兼容。禁用Device / Credential Guard后,可以运行VMwar...

Hern(宋兆恒) 39万+

高效与灵活相结合:Verilog编写的跨时钟域循环缓冲控制器解析

循环缓冲区,也被称作循环队列、环形缓冲区,是一种数据结构,其主要特性是使用一个固定大小的缓冲区作为数据的存储空间,这个缓冲区在逻辑上被视作是首尾相接的。虽然Verilog是一种常用的硬件描述语言,被广泛应用在FPGA和ASIC设计中,但是在描述循环缓冲区时,它并没有提供一种直接且灵活的方式来指定循环缓冲区的参数,如字长、缓冲区深度、缓冲区数量等。这给硬件设计带来了一定的不便。同时,该控制器的设计也充分考虑了硬件资源的利用率,通过优化的算法和数据结构,使得在实现高性能的同时,也能够有效地节省硬件资源。

qq_38334677的博客 1221

【LOJ】#2172. 「FJOI2016」所有公共子序列问题

题解 听说是什么序列自动机? 我们考虑对于每个位置的串,下面拼接相同的字符时,拼接最近的一个,这样可以保证不重不漏 为了实现这个我们需要什么呢,我们需要一个链表,记录一下每个位置的下一个字符会转移到哪里 例如 ABAB ch[1]['A'] = 3 ch[1]['B'] = 2 听起来挺好建的,具体可以看代码 然后我们记录dp[a][b]是第一个字符串a位置的字符为开头,第二个字符串b位...

weixin_30851409的博客 182

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

[FJOI2016]所有公共子序列问题(DP+序列自动机+高精度)

洛谷题目传送门 题目大意: 求两个字符串的公共子序列个数 解题思路 知识点: 序列自动机(Sequential automata) 据wjn大佬说,这是你学过的最简单的自动机算法 不得不说,这个自动机确实不难,不过相关它的题可是把人写懵了 它的核心就是一个Next数组 Next[x][c]表示在当前字符串的第x位置往后的第一个字符c的位置 构造思路就是从后往前构造 void build(int p) { for(int i=n-1;i>=0;i--) { for(int c=0;c<=5

jwg2732的专栏 203

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

LOJ 2172 「FJOI2016」所有公共子序列问题——序列自动机

题目:https://loj.ac/problem/2172 在两个序列自动机上同时走,这样暴搜。 先走字典序小的字符,一边搜一边输出,就是按字典序排序的。 方案数很多,需要高精度?空间很小,要压位。1e9的20位恰好够。 不开 n*n 的DP数组,给出现的状态分配一个位置,开 3e6 的DP数组,空间就能了。 #include<cstdio> #include<...

weixin_34013044的博客 282

【LOJ2172】所有公共子序列问题(FJOI2016)-序列自动机+DP+高精度

测试地址:所有公共子序列问题 做法:本题需要用到序列自动机+DP+高精度。 序列自动机,顾名思义,就是能识别一个字符串所有本质不同的子序列的自动机。构建的方法十分简单:只需要从字符串上的每个点,向后面每种字符第一次出现的位置连边即可。唯一要注意的是,就像是所有其他自动机一样,还是要多建立一个空点表示空串的。因此,令字符集大小为sss,字符串长度为nnn,那么构建序列自动机的时间复杂度是O(sn...

Maxwei_wzj的OI世界 385

【洛谷P4608】【FJOI2016】—所有公共子序列问题(序列自动机+DP+高精度)

传送门 对两个串建出序列自动机之后直接n2dpn^2dpn2dp即可 由于答案很大,需要写个高精度 由于答案很大,要写压位高精,否则会TTT 由于空间直接开不下,于是写了个mapmapmap存状态 由于出题人很神奇,输出方案的话必须要在开头输出一个空串 #include<bits/stdc++.h> using namespace std; const int RLEN=1<&l...

Stargazer的博客 223

P4608 [FJOI2016] 序列自动机

题意 传送门 P4608 [FJOI2016]所有公共子序列问题 题解 序列自动机,原理即记录序列各个位置对应的每一个字符集元素的下一个出现的位置,则从根节点 DFSDFSDFS 即可遍历所有子序列。对于公共子序列问题,将序列 X,YX, YX,Y 处理为序列自动机,从根节点沿相同路径 DFSDFSDFS,则遍历的所有路径对应了所有的公共子序列。 #include <algorithm> #include <cmath> #include <cstdio> #includ

neweryyy的博客 248

[刷题#1][FJOI2015]所有公共子序列问题

题意简述: 给定两个长度分别为n,m的字符串X,Y以及一个整数k。 若k=0,输出X,Y的公共子序列个数 若k=1,输出X,Y的所有公共子序列以及个数,空集算在内。 这一道题我刚开始没什么思路,然后看了一下题解,发现做法不是按照一位一位来,而是按照字符来建造Trie树。 于是自己思考了一下做法,以0位根节点,对于每个(i,j)(i#include<cstdio> #

wazwaztime的博客 559
上一篇: 【HAOI2011 Day1】防线修建
下一篇: 【BJOI2017】魔法咒语
StrideTG
博客等级 码龄9年 4粉丝 38原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值