Codeforces 670C Two Strings

本文介绍了一种用于判断一个字符串的所有字符是否至少出现在另一个字符串的一个子序列中的算法。通过遍历长字符串,检查其每个字符是否能与短字符串形成有效的子序列,确保每个字符至少参与一次匹配。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

A subsequence of length |x| of string s = s1s2… s|s| (where |s| is the length of string s) is a string x = sk1sk2… sk|x| (1 ≤ k1 < k2 < … < k|x| ≤ |s|).

You’ve got two strings — s and t. Let’s consider all subsequences of string s, coinciding with string t. Is it true that each character of string s occurs in at least one of these subsequences? In other words, is it true that for all i (1 ≤ i ≤ |s|), there is such subsequence x = sk1sk2… sk|x| of string s, that x = t and for some j (1 ≤ j ≤ |x|) kj = i.

Input
The first line contains string s, the second line contains string t. Each line consists only of lowercase English letters. The given strings are non-empty, the length of each string does not exceed 2·105.

Output
Print “Yes” (without the quotes), if each character of the string s occurs in at least one of the described subsequences, or “No” (without the quotes) otherwise.

Examples
input

abab
ab
output
Yes
input
abacaba
aba
output
No
input
abc
ba
output
No
Note
In the first sample string t can occur in the string s as a subsequence in three ways: abab, abab and abab. In these occurrences each character of string s occurs at least once.

In the second sample the 4-th character of the string s doesn’t occur in any occurrence of string t.

In the third sample there is no occurrence of string t in string s.
可以考虑直接模拟解决:

#include <cstdio>
#include <cstring>
using namespace std;
int main()
{
      int q,q1,w,e,r=0,t=0,d[26];
      char a[200001],s[200001];
      scanf("%s%s",a,s);
      q=strlen(a);
      q1=strlen(s);//记录长度

      for(w=0;w<26;w++)
       d[w]=-1;//初始化标记数组
       for(w=0;w<q;w++)
       {
           if(a[w]==s[t])
           {//遍历长串与短串的元素
            t++;//按短串的元素为指标挨个从长串中搜,搜到一个就累加一
            d[a[w]-97]=t;
           }//记录长串的元素对应的在短串中的第几个

       if(a[w]==s[r])//如果长串对应元素与短串相应元素相同
        r++;//累加一
       if(d[a[w]-97]<r)  //排除长串中未在短串中出现的情况如样例中abacaba 与aba,c元素未出现,r记-1
        r=d[a[w]-97];
       if(r<0)
        break;
        }
      if(r<q1)
       printf("No");
      else
       printf("Yes");
      return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值