CF223B Two Strings
当前点
i
i
i的字母在
s
s
s中最右能匹配到
r
i
r_i
ri,最左能匹配到
l
i
l_i
li
一旦存在某个
i
i
i,
r
i
<
l
i
r_i<l_i
ri<li即不合法
string s,t;
cin>>s>>t;
int ls=s.length(),lt=t.length();
vector<int> l(ls),r(ls),pos(26,-1);
for (int i=0,j=-1;i<ls;i++){
if (j+1<lt&&s[i]==t[j+1]){
pos[s[i]-'a']=++j;
}
r[i]=pos[s[i]-'a'];
}
for (int i=0;i<26;i++) pos[i]=lt;
for (int i=ls-1,j=lt;i>=0;i--){
if (j-1>=0&&s[i]==t[j-1]){
pos[s[i]-'a']=--j;
}
l[i]=pos[s[i]-'a'];
}
for (int i=0;i<ls;i++){
if (r[i]<l[i]){
cout<<"No";
return 0;
}
}
cout<<"Yes";