newcoder 练习赛17 B 好位置 dp 最长公共子序列

链接:https://www.nowcoder.com/acm/contest/109/B
来源:牛客网

好位置

时间限制:C/C++ 1秒,其他语言2秒

空间限制:C/C++ 32768K,其他语言65536K

64bit IO Format: %lld

题目描述

给出两个串s和x
定义s中的某一位i为好的位置,当且仅当存在s的子序列 满足y=x且存在j使得i=kj成立。
问s中是否所有的位置都是好的位置。

输入描述:

一行两个字符串s,x,这两个串均由小写字母构成。1 <= |s|, |x| <= 200000

输出描述:

Yes表示是。No表示不是。

示例1

输入

abab
ab

输出

Yes

示例2

输入

abacaba
aba

输出

No

示例3

输入

abc
ba

输出

No

思路:dp[i]代表s前i个字符(包含第i个字符)所能匹配到e的最长位置注意递推方程:如果s[i]==e[j] dp[i]=j;       else dp[i]等于用该位置去替代(1,j)中最大的那一个字符与s[i]相等的位置,同时保证了最长公共序列相当于在s的子序列里查找e串 ,66666666
#include<bits/stdc++.h>
using namespace std;
const int N=2e5+10;
int dp[N][2];
string a,b;
vector<int>pos[26];
int main(){
	std::ios::sync_with_stdio(false);
	while(cin>>a>>b){
		int l1=a.size(),l2=b.size();
		for(int i=0;i<l2;i++) pos[b[i]-‘a‘].push_back(i);
		int j=0;
		for(int i=0;i<l1;i++){
			if(a[i]==b[j]) j++;
			else{
				int t=a[i]-‘a‘;
				int tt=lower_bound(pos[t].begin(),pos[t].end(),j)-pos[t].begin()-1;
				j=tt+1;
			}
			dp[i][0]=j;
		}
		j=0;
		reverse(a.begin(),a.end());
		reverse(b.begin(),b.end());
		for(int i=0;i<=25;i++) pos[i].clear();
		for(int i=0;i<l2;i++) pos[b[i]-‘a‘].push_back(i);
		for(int i=0;i<l1;i++){
			if(a[i]==b[j]) j++;
			else{
				int t=a[i]-‘a‘;
				int tt=lower_bound(pos[t].begin(),pos[t].end(),j)-pos[t].begin()-1;
				j=tt+1;
			}
			dp[i][1]=j;
		}
		int flag=1;
		for(int i=0;i<l1;i++){
			if(dp[i][0]+dp[l1-1-i][1]<l2) {flag=0;break;}
		}
		if(flag) cout<<"Yes"<<"\n";
		else cout<<"No"<<"\n";
	}
	return 0;
}

  

原文地址:https://www.cnblogs.com/vainglory/p/9021568.html

时间: 2024-10-29 02:51:41

newcoder 练习赛17 B 好位置 dp 最长公共子序列的相关文章

POJ 2250 Compromise (DP,最长公共子序列)

Compromise Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 6440 Accepted: 2882 Special Judge Description In a few months the European Currency Union will become a reality. However, to join the club, the Maastricht criteria must be fulfille

hdu 1159 Common Subsequence(dp 最长公共子序列问题LCS)

最长公共子序列问题(LCS,Longerst Common Subsequence). s1s2……si+1和t1t2……tj+1的公共子序列可能是: ①当si+1=tj+1时,在s1s2……si+1和t1t2……tj+1的公共子序列末尾追加一个. ②s1s2……si+1和t1t2……tj的公共子序列 ③s1s2……si和t1t2……tj+1的公共子序列 所以易得到递推关系dp[i+1][j+1]=  max{ dp[i][j]+1 , dp[i][j+1] , dp[i+1][j]) }  

hdu1159 dp(最长公共子序列)

题意:给两个字符串,求这两个字符串的最长公共子序列的长度 因为之前集训的时候做过,所以现在即使会做也并不是什么稀奇的事,依旧为了自己的浅薄感到羞愧啊``` 解法就是通过两个字符串的每个字符互相比较,根据比较情况相同与否确定递推关系: dp [ i + 1 ] [ j + 1 ] 表示匹配到 a 字符串的第 i 个字符和 b 字符串的第 j 个字符时的最大匹配数,由于读字符串的时候我是从下标 0 读起的,但我需要用 dp [ 0 ] ,所以就都是加了一,否则也可以读入的时候直接从 a + 1 和

经典dp 最长公共子序列

首先,说明一下子序列的定义…… 一个序列A={a1,a2,a3,...,an},从中删除任意若干项,剩余的序列叫A的一个子序列. 很明显(并不明显……),子序列……并不需要元素是连续的……(一开始的时候思维总是以为元素是连续的,好傻啊……) 然后是公共子序列…… 如果C是A的子序列,也是B的子序列,那么C是A和B的公共子序列…… 公共子序列一般不止一个,最长的那个就是最长公共子序列,当然也可能不止一个…… 煮个栗子…… A={1,3,6,9,5,4,8,7},B={1,6,3,4,5,7} {1

POJ 1159 Palindrome(区间DP/最长公共子序列+滚动数组)

Palindrome Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 56150   Accepted: 19398 Description A palindrome is a symmetrical string, that is, a string read identically from left to right as well as from right to left. You are to write a

poj1159--Palindrome(dp:最长公共子序列变形 + 滚动数组)

Palindrome Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 53414   Accepted: 18449 Description A palindrome is a symmetrical string, that is, a string read identically from left to right as well as from right to left. You are to write a

hdu 1159 经典dp最长公共子序列

背景:上次比赛就没有做出来,回来根据实际意义半天也想不出如何dp,结果从猜转移方程入手,竟然想对了!开始想把空间优化到一维数组,没有想到要用同维度左边的值wa了. 思路: dp[i][j]=max{max[i-1][j],max[i][j-1],max[i-1][j-1]+(a[i] == b[j])} //dp[i][j]定以为,a串的前i个字符和b串的前b个字符的最大字串和,为选a串的第i个字符而不选b串的第j个字符,不选a串的第i个字符而选b串的第j个字符,既选a串的第i个字符又选b串的第

UVa 10066 Twin Towers (DP 最长公共子序列)

题意  求两串数字最长公共子序列的长度 裸的lcs没啥说的 #include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int maxn=105; int a[maxn],b[maxn],d[maxn][maxn],na,nb; void lcs() { memset(d,0,sizeof(d)); for(int i=1; i<=na; ++i) for(in

hdu 1159 Common Subsequence(最长公共子序列 DP)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1159 Common Subsequence Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 25416    Accepted Submission(s): 11276 Problem Description A subsequence of