LOJ 2172 「FJOI2016」所有公共子序列问题——序列自动机
题目:https://loj.ac/problem/2172
在两个序列自动机上同时走,这样暴搜。
先走字典序小的字符,一边搜一边输出,就是按字典序排序的。
方案数很多,需要高精度?空间很小,要压位。1e9的20位恰好够。
不开 n*n 的DP数组,给出现的状态分配一个位置,开 3e6 的DP数组,空间就能了。
#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
const int N=,K=;
int n,m,c[N][K],d[N][K],lst[K];
char a[N],b[N];
int Id(char ch)
{
if(ch<='Z')return ch-'A';
return ch-'a'+;
}
char Id2(int k)
{
if(k<)return k+'A';
return k-+'a';
}
namespace S1{
int ans,top; char s[N];
void dfs(int p0,int p1)
{
printf("%s\n",s+); ans++;
for(int i=;i<;i++)
if(c[p0][i]<=n&&d[p1][i]<=m)
{
s[++top]=Id2(i);
dfs(c[p0][i],d[p1][i]);
s[top]=s[top+];top--;
}
}
void solve()
{dfs(,); printf("%d\n",ans);}
}
namespace S2{
const int M=3e6,bs=1e9;
int tot; int dy[N][N];
struct Node{
int a[];//
void Inc(int k)
{
a[]+=k;
for(int i=;i<=a[];i++)
if(a[i]>=bs)a[i]-=bs,a[i+]++;
while(a[a[]+])a[]++;
}
void Inc(Node k)
{
int lm=max(a[],k.a[]);
for(int i=;i<=lm;i++)
{
a[i]+=k.a[i];
if(a[i]>=bs)a[i+]+=a[i]/bs,a[i]%=bs;
}
while(a[a[]+])a[]++;
}
void print()
{
printf("%d",a[a[]]);
for(int i=a[]-;i;i--)
printf("%09d",a[i]);puts("");
}
}dp[M];
int dfs(int p0,int p1)
{
if(dy[p0][p1])return dy[p0][p1];
int cr=++tot; dy[p0][p1]=cr; dp[cr].Inc();
for(int i=,x,y;i<;i++)
if((x=c[p0][i])<=n&&(y=d[p1][i])<=m)
{
int v=dfs(x,y); dp[cr].Inc(dp[v]);
}
return cr;
}
void solve()
{ int v=dfs(,); dp[v].print();}
}
int main()
{
scanf("%d%d",&n,&m);
scanf("%s",a+); scanf("%s",b+);
for(int i=;i<;i++)lst[i]=n+;
for(int i=n;i>=;i--)
{
for(int j=;j<;j++)
c[i][j]=lst[j];
lst[Id(a[i])]=i;
}
for(int i=;i<;i++)lst[i]=m+;
for(int i=m;i>=;i--)
{
for(int j=;j<;j++)
d[i][j]=lst[j];
lst[Id(b[i])]=i;
}
int op;scanf("%d",&op);
if(op==)S1::solve();
else S2::solve();
return ;
}
LOJ 2172 「FJOI2016」所有公共子序列问题——序列自动机的更多相关文章
- 【LOJ】#2172. 「FJOI2016」所有公共子序列问题
题解 听说是什么序列自动机? 我们考虑对于每个位置的串,下面拼接相同的字符时,拼接最近的一个,这样可以保证不重不漏 为了实现这个我们需要什么呢,我们需要一个链表,记录一下每个位置的下一个字符会转移到哪 ...
- @loj - 2174@ 「FJOI2016」神秘数
目录 @description@ @solution@ @accepted code@ @details@ @description@ 一个可重复数字集合 S 的神秘数定义为最小的不能被 S 的子集的 ...
- Loj #3056. 「HNOI2019」多边形
Loj #3056. 「HNOI2019」多边形 小 R 与小 W 在玩游戏. 他们有一个边数为 \(n\) 的凸多边形,其顶点沿逆时针方向标号依次为 \(1,2,3, \ldots , n\).最开 ...
- LOJ #2359. 「NOIP2016」天天爱跑步(倍增+线段树合并)
题意 LOJ #2359. 「NOIP2016」天天爱跑步 题解 考虑把一个玩家的路径 \((x, y)\) 拆成两条,一条是 \(x\) 到 \(lca\) ( \(x, y\) 最近公共祖先) 的 ...
- Loj #2192. 「SHOI2014」概率充电器
Loj #2192. 「SHOI2014」概率充电器 题目描述 著名的电子产品品牌 SHOI 刚刚发布了引领世界潮流的下一代电子产品--概率充电器: 「采用全新纳米级加工技术,实现元件与导线能否通电完 ...
- Loj #3096. 「SNOI2019」数论
Loj #3096. 「SNOI2019」数论 题目描述 给出正整数 \(P, Q, T\),大小为 \(n\) 的整数集 \(A\) 和大小为 \(m\) 的整数集 \(B\),请你求出: \[ \ ...
- Loj #3093. 「BJOI2019」光线
Loj #3093. 「BJOI2019」光线 题目描述 当一束光打到一层玻璃上时,有一定比例的光会穿过这层玻璃,一定比例的光会被反射回去,剩下的光被玻璃吸收. 设对于任意 \(x\),有 \(x\t ...
- Loj #3089. 「BJOI2019」奥术神杖
Loj #3089. 「BJOI2019」奥术神杖 题目描述 Bezorath 大陆抵抗地灾军团入侵的战争进入了僵持的阶段,世世代代生活在 Bezorath 这片大陆的精灵们开始寻找远古时代诸神遗留的 ...
- Loj #2542. 「PKUWC2018」随机游走
Loj #2542. 「PKUWC2018」随机游走 题目描述 给定一棵 \(n\) 个结点的树,你从点 \(x\) 出发,每次等概率随机选择一条与所在点相邻的边走过去. 有 \(Q\) 次询问,每次 ...
随机推荐
- Ubuntu Server 14 配置
语言 在虚拟机中安装了Ubuntu Server. Ubuntu Server只有控制台,没有图形界面.要在控制台下安装中文支持很麻烦.所以直接设置为英文,反正我看得懂. 在安装的时候必须将" ...
- TT8509: PL/SQL execution terminated; PLSQL_TIMEOUT exceeded
TT8509: PL/SQL execution terminated; PLSQL_TIMEOUT exceeded plsql_timeout连接超时,解决办法: ODBC pl/sql选项卡 修 ...
- 2018最新mfc作为上位机接收硬件端USB或串口数据显示成图片 解决串口接收数据丢字节丢包问题
原文作者:aircraft 原文地址:https://www.cnblogs.com/DOMLX/p/9490616.html 本文用的是VS2013MFC写串口数据接收: 第一步:首先建立一个MFC ...
- TOJ 2641 Gene
描述 How can millions of different and complex structures be built using only a few simple building bl ...
- Linux虚拟内存系统详解
本文章以Linux为例,讲解一下虚拟内存系统的工作原理,windows系统的原理也是大同小异,有兴趣的读者可以自行查阅相关资料. linux内核以及它管理用户内存的机制,下面我们以应用程序gonzo的 ...
- java io 学习笔记(一)
java的IO操作都在java.io包下面,这个包下面有12个接口和而是多各类,类从读写的角度可以分为两种,一种是用于读,一种是用于写:从字符流字节流的角度,也可以分为两种,一种和字符有关,一种和字节 ...
- 开源TSDB简介--Druid
开源TSDB简介--Druid Druid是一个以Java编写的开源分布式列式数据存储. Druid的目标是快速提取大量事件数据,并提供低延迟的查询. 德鲁伊的名字来源于许多角色扮演游戏中的变形德鲁伊 ...
- CSS气泡
气泡状文本框,是一种很生动的网页设计手段. 它可以用来表示用户的发言. 也可以用来作为特定信息的提示符. DVD租借网站Netflix,还用它显示碟片的详细信息. ================== ...
- tushare获取的数据与mysql数据库交互简单范例
#!/usr/bin/python2.7# -*- coding: UTF-8 -*- import tushare as tsimport pandas as pdfrom sqlalchemy i ...
- Bash 脚本语法
每次学了忘,忘了学,怎么记不住,因为长时间不用了 Bash 流程控制 循环 for循环 for item in $list do echo $item done 另一种与C语言类似的写法 ; i< ...