题意:http://www.codeforces.com/problemset/problem/223/B
母串, 子串。 母串中的任意一个字母‘A’的前面都必须出现过子串'A'前面出现过的字母, 后面也是。 问, 对于每个母串中的字母是否成立?
解:
我理解的是标记母串对应子串中最早能出现的位置为1, 最晚能出现的位置为-1。如果母串中有个字母在最左的字母之后仍为0(这个字母的计数为0)的话, 那么就说明这个字母不行。
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
char base[200010];
char fn[200010];
int markp[200010],markm[200010];
int occ[30];
int l1,l2;
int a,b;
int main()
{
scanf("%s",base+1);
scanf("%s",fn+1);
l1=strlen(base+1);
l2=strlen(fn+1);
b=1;
for (a=1; a<=l1; a++)
if (base[a]==fn[b]) markp[a]++, b++;
if (b<=l2)
{
printf("No");
return 0;
}
b=l2;
for (a=l1; a>=1; a--)
if (base[a]==fn[b]) markm[a]--, b--;
for (a=1; a<=l1; a++)
{
occ[base[a]]+=markp[a];
if (occ[base[a]]==0)
{
printf("No");
return 0;
}
occ[base[a]]+=markm[a];
}
printf("Yes");
}