http://codeforces.com/problemset/problem/223/B
判断第一个串是不是由第二个串构成。
如果第一个串的任意一点都属于一个和第二个串相同的子序列 输出yes 可以重复利用。
从左右分别遍历一次
left记录从左边遍历后该点在合法的情况下所能到的最右端位置
right记录从右边遍历后该点在合法的情况下所能到的最左端位置
如果left<right 肯定不合法
/*
abaca abca
01023
01323
*/
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
using namespace std;
int main()
{
string a,b;
int left[200001],right[200001];
memset(left,-1,sizeof(left));
memset(right,-1,sizeof(right));
int n[27];
memset(n,-1,sizeof(n));
cin>>a>>b;
for(int i=0,j=0;i<a.size();i++)
{
if(a[i]==b[j]&&j<=b.size())
{
left[i]=n[a[i]-'a']=j;
j++;
}
else left[i]=n[a[i]-'a'];
}
memset(n,-1,sizeof(n));
for(int i=a.size()-1,j=b.size()-1;i>=0;i--)
{
if(a[i]==b[j]&&j>=0)
{
right[i]=n[a[i]-'a']=j;
j--;
}
else right[i]=n[a[i]-'a'];
}
bool f=0;
for(int i=0;i<a.size();i++)
{
if(right[i]==-1||left[i]==-1||left[i]<right[i])
{
f=1;
cout<<"No"<<endl;
break;
}
}
if(f==0)
cout<<"Yes"<<endl;
return 0;
}