来源:牛客网
题目描述
给出一个长度为n的字符串s和q个查询。对于每一个查询,会输入一个字符串t,你需要判断这个字符串t是不是s的子串。子串的定义就是存在任意下标a<b<c<d<e,那么”s[a]s[b]s[c]s[d]s[e]”就构成s的一个子串。如”abc”的子串有”a”、”b”、”c”、”ab”、”ac”、”bc”、”abc”。输入描述:
第一行两个数n,q。1<=n,q<=1e5。
第二行一个长度为n的字符串s,所有字符都为小写拉丁字符。
接下来q行每行一个字符串t。1<=|t|<=50。
输出描述:
对于每个查询,如果t是s的字串,输出”YES”,否则输出”NO”。每个答案占一行。示例1
输入
复制8 4 ababcbaa abac accb aaaa abcba
输出
复制YES NO YES YES
分析:
将每个数在主串中的位置存下来,在子串中用二分找每个数的位置,如果找不到,就说明NO
//#define int ll const int N = 2e5+10,P = 131; int n,m; string s; int hasha[N],ba[N]; int p[N]; void solve() { cin>>n>>m; cin>>s; s = ' ' + s; string t; V<int> v[27]; for(int i = 1;i<=n;i++) { v[s[i] - 'a'].pb(i); } for(int i = 0;i < 26;i ++ ) { v[i].pb(1e9); } fo(lun,1,m) { cin>>t; int pos = -1; int ok = 1; t = ' ' + t; for(int i = 1;i<= t.length() - 1; i ++ ) { if(v[t[i] - 'a'].size() == 0) { ok = 0;break; } pos = *upper_bound(v[t[i] - 'a'].begin(),v[t[i] - 'a'].end(),pos); if(pos == 1e9) { ok = 0;break; } } if(ok) {cout<<"YES"<<endl;} else {cout<<"NO"<<endl;} } }
标签:子串,主串,NO,int,查询,字符串,YES,二分 来源: https://www.cnblogs.com/er007/p/16695216.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。