首页 > 其他分享 >CF762C Two strings 题解

CF762C Two strings 题解

时间:2023-09-18 20:11:43浏览次数:46  
标签:靠左 int 题解 CF762C Two 特判 靠右 字符串

洛谷传送门
CF 传送门

题意

给你两个字符串 \(a\) 和 \(b\),你可以在 \(b\) 中删去尽量短的子段,使得 \(b\) 是 \(a\) 的子序列。求出最后的 \(b\)。

思路

真是奇了怪了,这种题洛谷题解里竟然没有双指针的做法?

首先考虑判断一个字符串 \(b\) 是否是另一个字符串 \(a\) 的子序列。这个问题相信学过点 \(\text{OI}\) 的人都会做。

其实在做上面这个题的时候,因为贪心,\(b\) 字符串的最右边字符对应在 \(a\) 中一定是最靠左的。那么很容易,也可以求出 \(b\) 的最左边字符在 \(a\) 中最靠右的位置。

现在再看原题,其实就是把 \(b\) 字符串分成前后两个部分,其中前一个部分在 \(a\) 中尽量靠左,后一个部分在 \(a\) 中尽量靠右,并且两个不相交。

然后就好做了,先对 \(b\) 的每一个前缀求出「最右边字符对应在 \(a\) 中最靠左的位置」,每一个后缀求出「最左边字符对应在 \(a\) 中最靠右的位置」,分别用 \(L\) 和 \(R\) 数组保存。

最后我们要选出两个断点 \(l\) 和 \(r\),分别代表分成的前后两个部分的右端点和左端点,并且 \(L_l<R_r\),同时 \(r-l\) 要尽量的小。

所以这个怎么求呢?等等, \(L\) 和 \(R\) 单调递增?

那不是妥妥的双指针吗?

然后这题就做完了,时间复杂度 \(O(n)\)。

代码

#include <bits/stdc++.h>
using namespace std;
int n,m;
string a,b;
int L[100005],R[100005];
int ans=1e9,k1,k2;//最短r-l,以及两个断点的记录 
int main(){
	cin>>a>>b;
	n=a.length(),m=b.length();
	a=" "+a,b=" "+b;
	int r=1;//指针 
	for(int i=1;i<=m;i++){//预处理L数组 
		while(r<=n&&a[p]!=b[i]) r++;
		L[i]=r,r=min(r+1,n+1);
	}
	r=n;
	for(int i=m;i>=1;i--){//预处理R数组 
		while(r>=1&&a[p]!=b[i]) r--;
		R[i]=r,r=max(r-1,0);
	}
	if(L[1]==n+1&&R[m]==0){//这里特判一下,或者在最后特判也行 
		printf("-\n");
		return 0;
	}
	L[0]=0,R[m+1]=n+1;//防越界特判的操作 
	r=1;
	for(int l=0;l<=m;i++){//计算答案,双指针板板 
		if(L[l]==n+1) break;
		r=max(r,l+1);
		while(L[l]>=R[r]){
			r++; 
		}
		if(r-l-1<ans){
			ans=r-l-1,k1=l,k2=r;
		}
	}
	for(int i=1;i<=m;i++){
		if(i<=k1||i>=k2){
			cout<<b[i];
		}
	}
	printf("\n");
	return 0;
}

标签:靠左,int,题解,CF762C,Two,特判,靠右,字符串
From: https://www.cnblogs.com/candy0014/p/17712947.html

相关文章

  • Alice and Hairdresser题解
    AliceandHairdresser第一眼线段树,第二眼好像可以直接用数组模拟。当一根头发长于\(l\),它再长多长其实都一样,所以不用开longlong。如果一根新的头发长到比\(l\)长,那可以分成以下几种情况:如果它左侧和右侧只有一个元素大于\(l\),那答案不变。如果左侧和右侧都大于......
  • c# winform打开外部程序异常问题解决方案
    c#winform中打开外部程序的常规操作是使用Process类,此时,如果外部程序没有对路径的操作或其他路径文件的操作时,通常不会出现报错或异常;反之,会出现找不到路径或者直接抛出异常。此种情况主要是因为外部程序和当前程序不在一个路径下导致的,以下是解决方案:System.IO.Directory.Set......
  • yarn 出现 【 info There appears to be trouble with your network connection. Retr
    第一种解决方案#调整为taobao镜像源yarnconfigsetregistryhttps://registry.npm.taobao.org我用了没用,可以试试第二种解决方案要在项目根目录下创建后缀名为.yarnrc的文件,并设置network-timeout的值为600000,你可以按照以下步骤进行操作:打开文本编辑器,例如Note......
  • 【POJ 2488】A Knight‘s Journey 题解(深度优先搜索)
    背景骑士厌倦了一次又一次地看到同样的黑白方块,决定去旅行全世界每当骑士移动时,它是一个方向上的两个正方形和一个垂直于这个方向的正方形。骑士的世界就是他生活的棋盘。我们的骑士生活在一个棋盘上,这个棋盘的面积比普通的8*8棋盘小,但它仍然是矩形的。你能帮助这位冒险的骑士制......
  • [题解]Pa?sWorD(2023ICPC网络预选赛第一场I题)
    IPa?sWorD下次不要认为2e8可以莽过去了思路计数DP+状压(其实也可以不压)+前缀和优化(倒着写是差分)dp[i][j][k]表示第i位填j,状态为k的方案数k这一维用于状态压缩,表示数字、大写、小写是否出现前缀和优化:在处理?的时候,暴力会有62X62X8的单次复杂度,但不难发现,关于......
  • Death DBMS题解(AC自动机)
    题目传送门CF1437G好题观察这道题,发现有关字串的题目,一般来说,这种题都要构建\(AC\)自动机,所以考虑构建。构建之后,原来的所有\(fail\)是一个树形结构。解法\(1\):考虑从询问入手,那么对于每一个询问,等价于就是查询每一个\(Q_i\)包含的后缀的最大值,再对这些最大值取\(max......
  • 题解 LOJ2549【[JSOI2018] 战争】
    problem给你两个平面凸多边形\(A,B\),\(Q\)次询问,每次询问是一个向量\(\vecv\),回答\(A\)与\(B+\vecv\)是否有交。\(n,Q\leq10^5\)。solution观察闵可夫斯基和(Minkowskysum)的定义,若将这个运算定义为\((*)::[Point]\to[Point]\to[Point]\),则满足:\[A*B=\{......
  • Sensor Network
    题目描述Awirelesssensornetworkconsistsofautonomoussensorsscatteredinanenvironmentwheretheymonitorconditionssuchastemperature,sound,andpressure.SamanthaisaresearcherworkingontheAmazonCarbon-dioxideMeasurement(ACM)project.Int......
  • 【UVA 572】Oil Deposits 题解(深度优先搜索)
    GeoSurvComp地质调查公司负责探测地下石油矿床。GeoSurvComp一次处理一个大的矩形土地区域,并创建一个划分将土地分割成许多方形地块。然后使用传感设备分别分析每个地块确定图中是否含有油。含有石油的地块称为口袋。如果两个口袋相邻,则它们是相同的油沉积。油沉积物可能非常......
  • Layered Network stack
    3.LayeredNetworkstackModularityDoesnotspecifyanimplementationInstead,tellsushowtoorganizefunctionalityEncapsulationInterfacesdefinecross-layerinteractionLayersonlyrelyonthosebelowthemFlexibilityReuseofcodeacrossth......