题目链接: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 "); 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 "); else printf("NO "); } return 0; }