标签:sync 包含 其他 pac 输入 c++ abc 序列 code
链接:https://www.nowcoder.com/acm/contest/109/B
来源:牛客网
一行两个字符串s,x,这两个串均由小写字母构成。
1 <= |s|, |x| <= 200000
Yes表示是。
No表示不是。
abab ab
Yes
abacaba aba
No
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;
}
newcoder 练习赛17 B 好位置 dp 最长公共子序列
标签:sync 包含 其他 pac 输入 c++ abc 序列 code
原文地址:https://www.cnblogs.com/vainglory/p/9021568.html