题目:
样例:
题目链接:
月月查华华的手机
析题得侃:
Code:
#include <vector>
#include <cstdio>
#include <string>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int maxn = 1e6 + 10;
string a,b;
int n;
vector<int>ve[maxn];
int main(void) {
cin >> a;
for(int i = 0; i < a.size(); i ++) {
// 存储每个模式串中每个字符的位置
ve[a[i] - 'a'].push_back(i);
}
scanf("%d",&n);
while(n --) {
cin >> b;
bool vis = true;
int pos = -1; // 记录目前可以到达的最大位置
for(int i = 0; i < b.size(); i ++) {
// 说明模式串中没有该字符
if(ve[b[i] - 'a'].size() == 0) {
vis = false;
break;
}
int p = b[i] - 'a';
int l = 0,r = ve[p].size() - 1;
// 模式串中的位置已经无法满足要求
if(pos >= ve[p][r]) {
vis = false;
break;
}
while(l < r) { // 二分查找第一个 > pos 的位置
int mid = l + r >> 1;
if(ve[p][mid] > pos) r = mid;
else l = mid + 1;
}
pos = ve[p][r];
}
if(vis) cout << "Yes" << endl;
else cout << "No" << endl;
}
return 0;
}
后记:
如有解释的不清的地方,欢迎提出来,共同交流,共同学习进步。