2019南昌网络赛-M(二分)

题目链接:https://nanti.jisuanke.com/t/38232

题意:给定字符串s(长度<=1e5),然后N组样例(N<=1e5),每组输入一个字符串t判断t是否为s的字串(可以不连续)。

思路:直接暴力判断的话肯定会超时,可以用vector将每个英文字符出现的下标存放。然后对每一组输入,利用函数upper_bound(原理为二分)来查找,s的长度为m1,t的长度为m2,复杂度为O(N*m2*logm1)。

AC代码:

#include<cstdio>
#include<algorithm>
#include<vector>
#include<cstring>
using namespace std;

char s[100005],t[1005];
vector<int> v[30];
int len1,len2,N;

int main(){
    scanf("%s",s);
    len1=strlen(s);
    for(int i=0;i<len1;++i)
        v[s[i]-'a'].push_back(i);
    scanf("%d",&N);
    while(N--){
        scanf("%s",t);
        len2=strlen(t);
        if(v[t[0]-'a'].empty()){
            printf("NO\n");
            continue;
        }
        int p1=v[t[0]-'a'][0],p2,flag=1;
        for(int i=1;i<len2;++i){
            if(v[t[i]-'a'].empty()){
                flag=0;
                break;
            }
            int tmp=t[i]-'a';
            p2=upper_bound(v[tmp].begin(),v[tmp].end(),p1)-v[tmp].begin();
            if(p2<v[tmp].size()){
                p1=v[tmp][p2];
            }
            else{
                flag=0;
                break;
            }
        }
        if(flag) printf("YES\n");
        else printf("NO\n");
    }
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/FrankChen831X/p/10744273.html