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");
}

浙公网安备 33010602011771号