noi.ac#458 sequence
题目链接:戳我
蒟蒻的第一道子序列自动机!
给定两个01串A,B,求一个最短的01串,要求C不是A,B的子序列。要求如果同样短,输出字典序最小的。
那么我们先构建A,B两个串的子序列自动机。然后我们设\(f[i][j]\)表示现在已经匹配到A的第i位,B的第j位,现在还需要f[i][j]长度,才不是A,B的子序列。
那么\(f[i][j]\)从\(f[nxt_a[i][0/1]][nxt_b[i][0/1]]\)转移过来就行了。
比较重要的是如何构建出字典序最小的?
我们从x=0,y=0开始构建,每次选择ans-当前步数的状态,如果往后面接0合法,就优先接0,不行再接1.
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define MAXN 4010
#define INF 0x3f3f3f3f
using namespace std;
int lena,lenb,ans;
int cur[2],nxt_a[MAXN][2],nxt_b[MAXN][2],f[MAXN][MAXN];
char a[MAXN],b[MAXN];
int main()
{
#ifndef ONLINE_JUDGE
freopen("ce.in","r",stdin);
#endif
scanf("%s",a+1),scanf("%s",b+1);
lena=strlen(a+1),lenb=strlen(b+1);
cur[0]=lena+1,cur[1]=lena+1;
for(int i=lena;i>=0;i--)
{
nxt_a[i][0]=cur[0],nxt_a[i][1]=cur[1];
if(i!=0) cur[a[i]-'0']=i;
}
cur[0]=lenb+1,cur[1]=lenb+1;
for(int i=lenb;i>=0;i--)
{
nxt_b[i][0]=cur[0],nxt_b[i][1]=cur[1];
if(i!=0) cur[b[i]-'0']=i;
}
f[lena+1][lenb+1]=0;
nxt_a[lena+1][0]=lena+1,nxt_a[lena+1][1]=lena+1;
nxt_b[lenb+1][0]=lenb+1,nxt_b[lenb+1][1]=lenb+1;
for(int i=lena+1;i>=0;i--)
for(int j=lenb+1;j>=0;j--)
{
if(i==lena+1&&j==lenb+1) continue;
f[i][j]=INF;
f[i][j]=min(f[i][j],f[nxt_a[i][0]][nxt_b[j][0]]+1);
f[i][j]=min(f[i][j],f[nxt_a[i][1]][nxt_b[j][1]]+1);
}
ans=f[0][0];
int x=0,y=0;
for(int i=1;i<=ans;i++)
{
if(f[nxt_a[x][0]][nxt_b[y][0]]==ans-i)
{
printf("0");
x=nxt_a[x][0],y=nxt_b[y][0];
continue;
}
if(f[nxt_a[x][1]][nxt_b[y][1]]==ans-i)
{
printf("1");
x=nxt_a[x][1],y=nxt_b[y][1];
}
}
return 0;
}
noi.ac#458 sequence的更多相关文章
- # NOI.AC省选赛 第五场T1 子集,与&最大值
NOI.AC省选赛 第五场T1 A. Mas的童年 题目链接 http://noi.ac/problem/309 思路 0x00 \(n^2\)的暴力挺简单的. ans=max(ans,xor[j-1 ...
- NOI.ac #31 MST DP、哈希
题目传送门:http://noi.ac/problem/31 一道思路好题考虑模拟$Kruskal$的加边方式,然后能够发现非最小生成树边只能在一个已经由边权更小的边连成的连通块中,而树边一定会让两个 ...
- NOI.AC NOIP模拟赛 第五场 游记
NOI.AC NOIP模拟赛 第五场 游记 count 题目大意: 长度为\(n+1(n\le10^5)\)的序列\(A\),其中的每个数都是不大于\(n\)的正整数,且\(n\)以内每个正整数至少出 ...
- NOI.AC NOIP模拟赛 第六场 游记
NOI.AC NOIP模拟赛 第六场 游记 queen 题目大意: 在一个\(n\times n(n\le10^5)\)的棋盘上,放有\(m(m\le10^5)\)个皇后,其中每一个皇后都可以向上.下 ...
- NOI.AC NOIP模拟赛 第二场 补记
NOI.AC NOIP模拟赛 第二场 补记 palindrome 题目大意: 同[CEOI2017]Palindromic Partitions string 同[TC11326]Impossible ...
- NOI.AC NOIP模拟赛 第一场 补记
NOI.AC NOIP模拟赛 第一场 补记 candy 题目大意: 有两个超市,每个超市有\(n(n\le10^5)\)个糖,每个糖\(W\)元.每颗糖有一个愉悦度,其中,第一家商店中的第\(i\)颗 ...
- NOI.AC NOIP模拟赛 第四场 补记
NOI.AC NOIP模拟赛 第四场 补记 子图 题目大意: 一张\(n(n\le5\times10^5)\)个点,\(m(m\le5\times10^5)\)条边的无向图.删去第\(i\)条边需要\ ...
- NOI.AC NOIP模拟赛 第三场 补记
NOI.AC NOIP模拟赛 第三场 补记 列队 题目大意: 给定一个\(n\times m(n,m\le1000)\)的矩阵,每个格子上有一个数\(w_{i,j}\).保证\(w_{i,j}\)互不 ...
- NOI.AC WC模拟赛
4C(容斥) http://noi.ac/contest/56/problem/25 同时交换一行或一列对答案显然没有影响,于是将行列均从大到小排序,每次处理限制相同的一段行列(呈一个L形). 问题变 ...
随机推荐
- 【转】js小数转百分比
转自:js小数和百分数的转换 function toPercent(point){ var str=Number(point*100).toFixed(1); str+="%"; ...
- CF10D-LCIS题解--线性DP+打印方案
题目链接: https://www.luogu.org/problemnew/show/CF10D 方法一 分析 \(LCS\)和\(LIS\)已经成烂大街的知识了,可是当这两个合并起来成为\(LCI ...
- [转载]flex中的正则表达式
原文:https://blog.csdn.net/hczhiyue/article/details/20483209 (1)单字符匹配* ‘x’ 匹配字符 x.* ‘.’ 匹配任意一个字符(字节),除 ...
- PHP扩展之 Imagick安装
最近的PHP项目中,需要用到切图和缩图的效果,在本地windows开发环境,安装过程遇到好多问题,在此与大家分享. php官网里,一大群老外也看不懂这玩意怎么装,主要原因在于,php版本庞杂,还有x8 ...
- 微信小程序子传父
子组件 父组件
- Docker镜像构建文件Dockerfile及相关命令介绍
使用docker build命令或使用Docker Hub的自动构建功能构建Docker镜像时,都需要一个Dockerfile文件.Dockerfile文件是一个由一系列构建指令组成的文本文件,doc ...
- 第一章·ELKstack介绍及Elasticsearch部署
一.ELKstack课程大纲  二.ELKstack简介 什么是ELK? 通俗来讲,ELK是由Elasticsearch.Logstash.Kibana 三个开源软件的组成的一个组合体,这三个软件当 ...
- Linux工具之top
top命令详解: 第一行:10:01:23----当前系统时间 126days,14:29------系统已经运行了126天14小时29分钟(在这期间没有重启过) 2users------当前 ...
- 序列化 json pickle shelve configparser
一 什么是 序列化 在我们存储数据或者 网络传输数据的时候,需要对我们的 对象进行处理,把对象处理成方便我们存储和传输的 数据格式,这个过程叫序列化,不同的序列化,结果也不相同,但是目的是一样的,都是 ...
- [ZOJ 3063] Draw Something Cheat
题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=4706 思路:字符串是一个集合(由0到多个A~Z字符组成),我们可以假 ...