zoukankan      html  css  js  c++  java
  • [每日一题]:月月查华华的手机

    题目:

    样例:

    题目链接:

    月月查华华的手机

    析题得侃:

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

    后记:

    如有解释的不清的地方,欢迎提出来,共同交流,共同学习进步。
  • 相关阅读:
    码云的安装和配置
    Python解释器安装教程和环境变量配置
    Python基础学习
    buuctf CheckIn
    各种小马收集
    buuctf Easysql 小记
    locust
    封装好的日志模块
    实用的测试网站
    列表操作
  • 原文地址:https://www.cnblogs.com/prjruckyone/p/12625087.html
Copyright © 2011-2022 走看看