cf223 B. Two Strings(思维)

题意:

给定两个串 \(s,t\),若对 \(s\) 中的每个字符 \(s_i\),存在 \(s\) 的子序列包含 \(s_i\),且这子序列恰等于 \(t\),则输出Yes。否则输出No

思路:

有一点代表性的数据:

abcbab

abcab

\(s\) 的每个位置处理出 \(l_i,r_i\)\(r_i=x\) 表示使得 \(s[i]=t[x]\)\(t[1,x-1]\)\(s[1,i-1]\) 的子列的最右位置。\(l_i\) 同理。

const int N = 2e5 + 5, M = 29;
int n, m; char s[N], t[N];
int l[N], r[N], p[M];

signed main()
{
    cin >> s + 1 >> t + 1; n = strlen(s + 1), m = strlen(t + 1);

    memset(p, -INF, sizeof p);
    for(int i = 1, j = 1; i <= n; i++)
        if(s[i] == t[j]) r[i] = p[s[i]-'a'] = j++;
        else r[i] = p[s[i]-'a'];
    memset(p, INF, sizeof p);
    for(int i = n, j = m; i >= 1; i--)
        if(s[i] == t[j]) l[i] = p[s[i]-'a'] = j--;
        else l[i] = p[s[i]-'a'];

    for(int i = 1; i <= n; i++)
        if(l[i] > r[i]) return puts("No"), 0;

    puts("Yes");
}

posted @ 2022-02-11 22:59  Bellala  阅读(31)  评论(0)    收藏  举报