大意: 给定字符串$a$,$b$, $b$可以任选一段连续的区间删除, 要求最后$b$是$a$的子序列, 求最少删除区间长度.

删除一段连续区间, 那么剩余的一定是一段前缀和后缀. 判断是否是子序列可以用序列自动机, 最后双指针合并前缀与后缀的答案.

#include <iostream>
#include <sstream>
#include <algorithm>
#include <cstdio>
#include <math.h>
#include <set>
#include <map>
#include <queue>
#include <string>
#include <string.h>
#include <bitset>
#define REP(i,a,n) for(int i=a;i<=n;++i)
#define PER(i,a,n) for(int i=n;i>=a;--i)
#define hr putchar(10)
#define pb push_back
#define lc (o<<1)
#define rc (lc|1)
#define mid ((l+r)>>1)
#define ls lc,l,mid
#define rs rc,mid+1,r
#define x first
#define y second
#define io std::ios::sync_with_stdio(false)
#define endl '\n'
#define DB(a) ({REP(__i,1,m) cout<<a[__i]<<' ';hr;})
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
const int P = 1e9+7, INF = 0x3f3f3f3f;
ll gcd(ll a,ll b) {return b?gcd(b,a%b):a;}
ll qpow(ll a,ll n) {ll r=1%P;for (a%=P;n;a=a*a%P,n>>=1)if(n&1)r=r*a%P;return r;}
ll inv(ll x){return x<=1?1:inv(P%x)*(P-P/x)%P;}
inline int rd() {int x=0;char p=getchar();while(p<'0'||p>'9')p=getchar();while(p>='0'&&p<='9')x=x*10+p-'0',p=getchar();return x;}
//head #ifdef ONLINE_JUDGE
const int N = 1e6+10;
#else
const int N = 111;
#endif char s[N], p[N];
int n, m, nxt[26][N], pre[26][N];
int L[N], R[N]; int main() {
scanf("%s%s", s+1,p+1);
n = strlen(s+1);
m = strlen(p+1);
REP(i,1,n) s[i]-='a';
REP(i,1,m) p[i]-='a';
REP(c,0,25) {
nxt[c][n+1]=nxt[c][n+2]=n+1;
PER(i,1,n) {
if (s[i]==c) nxt[c][i]=i;
else nxt[c][i]=nxt[c][i+1];
}
REP(i,1,n) {
if (s[i]==c) pre[c][i]=i;
else pre[c][i]=pre[c][i-1];
}
}
L[1] = nxt[p[1]][1];
REP(i,2,m) L[i] = nxt[p[i]][L[i-1]+1];
R[m] = pre[p[m]][n];
PER(i,1,m-1) R[i] = pre[p[i]][R[i+1]-1];
int ans = 0, posR = 0, posL = 0;
PER(i,1,m) if (R[i]) ans = m-i+1, posR = i;
REP(i,1,m) p[i]+='a';
if (ans==m) return puts(p+1),0;
R[m+1] = INF;
int now = posR;
REP(i,1,m) {
while (R[now]<=L[i]) ++now;
if (L[i]==n+1) break;
if (ans<i+m-now+1) {
ans = i+m-now+1;
posL = i, posR = now;
}
}
if (!ans) return puts("-"),0;
REP(i,1,posL) putchar(p[i]);
REP(i,posR,m) putchar(p[i]);hr;
}

Two strings CodeForces - 762C (字符串,双指针)的更多相关文章

  1. Dreamoon and Strings CodeForces - 477C (字符串dp)

    大意: 给定字符串$s$, $p$, 对于$0\le x\le |s|$, 求$s$删除$x$个字符后, $p$在$s$中的最大出现次数. 显然答案是先递增后递减的, 那么问题就转化求最大出现次数为$ ...

  2. golang学习笔记15 golang用strings.Split切割字符串

    golang用strings.Split切割字符串 kv := strings.Split(authString, " ") if len(kv) != 2 || kv[0] != ...

  3. [LeetCode] 583. Delete Operation for Two Strings 两个字符串的删除操作

    Given two words word1 and word2, find the minimum number of steps required to make word1 and word2 t ...

  4. [LeetCode] 712. Minimum ASCII Delete Sum for Two Strings 两个字符串的最小ASCII删除和

    Given two strings s1, s2, find the lowest ASCII sum of deleted characters to make two strings equal. ...

  5. Codeforces 762C Two strings 字符串

    Cpdeforces 762C 题目大意: 给定两个字符串a,b\((len \leq 10^5)\),让你去b中的一个连续的字段,使剩余的b串中的拼接起来的两个串是a穿的子序列.最大化这个字串的长度 ...

  6. [LeetCode] Encode and Decode Strings 加码解码字符串

    Design an algorithm to encode a list of strings to a string. The encoded string is then sent over th ...

  7. [LeetCode] Minimum ASCII Delete Sum for Two Strings 两个字符串的最小ASCII删除和

    Given two strings s1, s2, find the lowest ASCII sum of deleted characters to make two strings equal. ...

  8. [LeetCode] Delete Operation for Two Strings 两个字符串的删除操作

    Given two words word1 and word2, find the minimum number of steps required to make word1 and word2 t ...

  9. [LeetCode] Split Concatenated Strings 分割串联字符串

    Given a list of strings, you could concatenate these strings together into a loop, where for each st ...

随机推荐

  1. SSH端口转发详解

    正文 一.SSH端口转发简介 SSH会自动加密和解密所有SSH客户端与服务端之间的网络数据.但是,SSH还能够将其他TCP端口的网络数据通SSH链接来转发,并且自动提供了相应的加密及解密服务.这一过程 ...

  2. [CSP-S模拟测试]:答题(meet in the middle)

    题目传送门(内部题142) 输入格式 输入文件的第一行为两个数$n,P$. 接下来一行$n$为个正整数,表示每道题的分数. 输出格式 输出一行一个正整数,为至少需要获得的分数. 样例 样例输入: 2 ...

  3. EBI架构 VS. MVC

    和 MVC 模式中的 Model 代表着整个后端(包括所有实体.服务和它们之间的关系在内的一切)一样,EBI 模式将边界看作是和外部世界的完整连接,而不仅仅是一个视图.一个控制器或是一个接口(这里指的 ...

  4. RequestsLibrary接口测试

    RequestsLibrary常用的关键字 关  键  字 描   述 Create Session 创建HTTP会话 Get Request 采用get方式请求 Post Request 采用Pos ...

  5. Linux - 加密打包

    tar 加密打包 压缩 tar -czvf /path/to/file.tar.gz file 解压 tar -xzvf /path/to/file.tar.gz /path/to 加密压缩 tar ...

  6. oracle imp 工具可能出现的问题

  7. qt liunx 安装命令

    qt SDK : apt-get install qt-sdkqt 安装 : apt-get install qtcreator文档安装 : cmake kdelibs5-data subversio ...

  8. Ceph 客户端的 RPM 包升级问题

    问题 最近想把一个现有的 Ceph 客户端升级为最新的 M 版: [root@overcloud-ovscompute-0 ~]# rpm -qa | grep ceph puppet-ceph-2. ...

  9. 【转】Java从hdfs上读取文件中的某一行

    [From]https://blog.csdn.net/u010989078/article/details/51790166 package test; import java.io.Buffere ...

  10. 认识一下 Kafka

    Kafka 基本概述 什么是 Kafka Kafka 是一个分布式流式平台,它有三个关键能力 订阅发布记录流,它类似于企业中的消息队列 或 企业消息传递系统 以容错的方式存储记录流 实时记录流 Kaf ...