标签: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