luogu4608 [FJOI2016]所有公共子序列问题
题目描述:
题解:
序列自动机(?)+高精+普及dp。
这个是猫老师的序列自动机(字符串从1开始):
void sol(char *s,int n,int t[N][])
{
memset(t[n],-,sizeof(t[n]));
for(int i=n-;i>=;i--)
{
memcpy(t[i],t[i+],sizeof(t[i]));
t[i][ci(s[i+])] = i+;
}
}
序列自动机
$t$数组记录在位置$i$的后面加字符$j$能到达的最左边的位置。
对于这道题,直接对两个串构造序列自动机,然后爆搜即可。
$k=1$没啥好说的,$k=0$高精压18位。
时间复杂度$O(n^2)$。
代码:
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
const int N = ;
const ll M = 1000000000000000000ll;
struct bignum
{
ll a[];//
int len;
void operator += (const bignum&x)
{
int mx = max(len,x.len);
for(int i=;i<mx;i++)
{
a[i]+=x.a[i];
if(a[i]>=M)a[i+]+=a[i]/M,a[i]%=M;
}
while(a[len])len++;
}
void operator += (const ll&x)
{
a[]+=x;
for(int i=;a[i]>=M;i++)a[i+]+=a[i]/M,a[i]%=M;
while(a[len])len++;
}
void write()
{
if(!len){puts("");return ;}
printf("%lld",a[len-]);
for(int i=len-;i>=;i--)
printf("%018lld",a[i]);
puts("");
}
}dp[];
int n,m,k,t1[N][],t2[N][],id[N][N],tot=,ans=;
char s1[N],s2[N];
int ci(char ch)
{
if(ch>='A'&&ch<='Z')return ch-'A';
return ch-'a'+;
}
char ic(int i)
{
if(i<)return 'A'+i;
return 'a'+i-;
}
void sol(char *s,int n,int t[N][])
{
memset(t[n],-,sizeof(t[n]));
for(int i=n-;i>=;i--)
{
memcpy(t[i],t[i+],sizeof(t[i]));
t[i][ci(s[i+])] = i+;
}
}
int tl;
char now[N];
void dfs1(int a,int b)
{
for(int i=;i<=tl;i++)
putchar(now[i]);
putchar('\n');
ans++;
for(int i=;i<;i++)if(~t1[a][i]&&~t2[b][i])
{
now[++tl] = ic(i);
dfs1(t1[a][i],t2[b][i]);
tl--;
}
}
void dfs2(int a,int b)
{
if(id[a][b])return ;
id[a][b]=++tot;
dp[tot]+=;
for(int i=;i<;i++)if(~t1[a][i]&&~t2[b][i])
{
dfs2(t1[a][i],t2[b][i]);
dp[id[a][b]]+=dp[id[t1[a][i]][t2[b][i]]];
}
} int main()
{
// freopen("tt.in","r",stdin);
scanf("%d%d%s%s%d",&m,&n,s1+,s2+,&k);
sol(s1,m,t1),sol(s2,n,t2);
if(k==){dfs1(,);printf("%d\n",ans);return ;}
dfs2(,);dp[id[][]].write();
return ;
}
luogu4608 [FJOI2016]所有公共子序列问题的更多相关文章
- 序列自动机—— [FJOI2016]所有公共子序列问题
序列自动机: 是一个处理子序列的自动机.就这样. 建造:(By猫老师:immoralCO猫) s[] next[][] memset(next[n], -, <<); for(int i ...
- 洛谷P4608 [FJOI2016]所有公共子序列问题 【序列自动机 + dp + 高精】
题目链接 洛谷P4608 题解 建个序列自动机后 第一问暴搜 第二问dp + 高精 设\(f[i][j]\)为两个序列自动机分别走到\(i\)和\(j\)节点的方案数,答案就是\(f[0][0]\) ...
- 【LOJ】#2172. 「FJOI2016」所有公共子序列问题
题解 听说是什么序列自动机? 我们考虑对于每个位置的串,下面拼接相同的字符时,拼接最近的一个,这样可以保证不重不漏 为了实现这个我们需要什么呢,我们需要一个链表,记录一下每个位置的下一个字符会转移到哪 ...
- 用python实现最长公共子序列算法(找到所有最长公共子串)
软件安全的一个小实验,正好复习一下LCS的写法. 实现LCS的算法和算法导论上的方式基本一致,都是先建好两个表,一个存储在(i,j)处当前最长公共子序列长度,另一个存储在(i,j)处的回溯方向. 相对 ...
- 动态规划之最长公共子序列(LCS)
转自:http://segmentfault.com/blog/exploring/ LCS 问题描述 定义: 一个数列 S,如果分别是两个或多个已知数列的子序列,且是所有符合此条件序列中最长的,则 ...
- [Data Structure] LCSs——最长公共子序列和最长公共子串
1. 什么是 LCSs? 什么是 LCSs? 好多博友看到这几个字母可能比较困惑,因为这是我自己对两个常见问题的统称,它们分别为最长公共子序列问题(Longest-Common-Subsequence ...
- 动态规划求最长公共子序列(Longest Common Subsequence, LCS)
1. 问题描述 子串应该比较好理解,至于什么是子序列,这里给出一个例子:有两个母串 cnblogs belong 比如序列bo, bg, lg在母串cnblogs与belong中都出现过并且出现顺序与 ...
- LintCode 77: 最长公共子序列
public class Solution { /** * @param A, B: Two string. * @return: the length of the longest common s ...
- 删除部分字符使其变成回文串问题——最长公共子序列(LCS)问题
先要搞明白:最长公共子串和最长公共子序列的区别. 最长公共子串(Longest Common Substirng):连续 最长公共子序列(Longest Common Subsequence,L ...
随机推荐
- Ubuntu下安装wine plsql
在电脑上安装了第二系统Ubuntu,但面临各种Linux不支持的开发软件也是束手无策.比如常用的Eclipse,PlSQl,Oracle,QQ等等,于是,上网查阅各种资料,最终的解决方案还是要依赖于w ...
- Floyd判圈法
---恢复内容开始--- http://blog.csdn.net/ruoruo_cheng/article/details/53100656 ---恢复内容结束---
- Netty(5)@Sharable
问题:我写了MyDecoder which extends ByteToMessageDecoder,单线程没问题,但是多线程时,报'the handler should be sharable'.查 ...
- devOps开发(Web API 实例)dotnet core 和 Azure PaaS服务
使用 dotnet core 和 Azure PaaS服务进行devOps开发(Web API 实例) 作者:陈希章 发表于 2017年12月19日 引子 这一篇文章将用一个完整的实例,给大家介绍如何 ...
- MVC3 自定义的错误页
ASP.NET MVC3中如果配置文件出错了,怎么跳转到自定义的错误页,现在参考网上的档案是说 添加 如下配置文件,并且在路径Views/Shared/下添加Error页面,测试下没有用的,请大家看看 ...
- Jquery使用ajax参数详解
记录一下 Jquery使用ajax(post.get及参数详解) 1.get: $.ajax({ type: "GET", url: baseUrl + "Showco ...
- 重写FileUpload控件让它可以显示上传后的文件名
我在以前的开发中经常遇到这样的场景:文件上传之后需要显示文件名,但是asp.net自带的fileupload是不能付给上传后的文件名值的. 以前都是做一个label显示的,今天想起来了,写个控件封装一 ...
- SCCM Collection 集合获取计算机最后启动时间
获取计算机客户端最后一次启动时间,我们可以通过多种来源获取,如活动目录组 ,而不仅仅是SCCM 收集,希望对您有所帮助,下面分享PowerShell 脚本 # 1 $CollectionName = ...
- SharePoint 2013 缺少站点保存为模板选项
如果您尝试在SharePoint Server 2013中保存站点,我们没有看到“将站点另存为模板”选项,则可能是因为该站点已启用站点发布功能.如 之前文章提到 “SharePoint 2010 缺少 ...
- BandwagonHost 5个数据中心/机房Ping速度测试亲自体验
我们选择Bandwagonhost服务器的原因之一在于有5个数据中心,而且与众多其他VPS不同之处在于可以自己后台切换机房和IP,这样我们 在遇到不满意的速度时候,可以自己切换其他机房更换,而且对于有 ...