Solution
##Code
#pragma GCC optimize(3) #include <bits/stdc++.h> using namespace std; typedef long long ll; typedef long long LL; const int N = 1e6 + 5; const ll mod = 1e9 + 7; const int DEG = 20; const double PI = acos(-1.0); const double eps = 1e-10; const ll inf = 1e18; static auto faster_iostream = []() { std::ios::sync_with_stdio(false); // turn off sync std::cin.tie(nullptr); // untie in/out streams return 0; }(); int nextz[N][26]; int tmp[30]; string s; bool solve(string t){ int cur = 0; // 主串位置 int id = 0; // 模式串位置 while(id < t.size()){ if(cur >= s.size()){ // 主串已经匹配完,模式串还没到结尾 return false; } if(s[cur] == t[id]){ // 当前位相同,直接匹配 id++; cur++; continue; } if(nextz[cur][t[id] - 'a'] == -1){ // 下一个该字母不存在 return false; } cur = nextz[cur][t[id] - 'a'] + 1; // 到下一个该字母的下一位 id++; } return id == t.size(); } int main(){ cin >> s; memset(tmp, -1, sizeof(tmp)); for(int i = s.size() - 1; i >= 0; i--){ for(int j = 0; j < 26; j++){ nextz[i][j] = tmp[j]; } tmp[s[i] - 'a'] = i; } int n; cin >> n; for(int i = 1; i <= n; i++){ string t; cin >> t; if(solve(t)){ cout << "Yes\n"; } else cout << "No\n"; } return 0; }