リンクします。https://ac.nowcoder.com/acm/contest/1083/B
出典:牛オフネットワーク
長さの文字列s、n及びqはクエリを考えます。各クエリは、文字列tを入力しますについて、あなたは文字列sとtはサブのではないかを決定する必要があります。ストリングが定義される任意のスケール<B <Cの存在<D < E、 その後、 "S [A] S [B ] S [C] S [D]の[E]" サブの文字列を構成します。"ABC"ストリング"は"、 "B"、有する "C"、 "AB"、 "AC"、 "BC"、 "ABC"を。
入力説明:
最初の2つの数のラインN、Q。1 <= N、Q <= 1E5。
文字列長nはSの2行目は、すべての文字が小文字のラテン文字です。
次Q線各文字列T。1 <= | T | <= 50。
説明出力:
各クエリに対して、tは文字列s、出力された場合、「YES」、そうでない場合は「NO」出力。行ごとの各回答。
例1つの
入力
コピー
。8. 4
ababcbaa
ABAC
ACCB
AAAA
ABCBAの
出力
コピー
YES
NO
YES
YES
問題の意味:入力文字列s及びqの長さのn番目の質問各入力文字列のT Q Tは、ストリングSがあるクエリ
アイデア:すべての文字の位置を見つけるために、2次元アレイを記録することにより表示される二部を有する各時間値が現在の位置よりも大きい場合に、現在位置の値よりも大きいが不在のサブストリングの代わりに存在しません。
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
vector <int> v[30];
int main()
{
int n,q;
string t,s;
cin >> n >> q >> s;
for(int i=0;i<n;i++)
v[s[i]-'a'].push_back(i);///记录每个字母出现的各个位置
while(q--)
{
cin >> t;
int pos=-1;
bool flag=0;
vector<int>::iterator it;
for(int i=0;i<t.size();i++)
{
it=upper_bound(v[t[i]-'a'].begin(),v[t[i]-'a'].end(),pos);///寻找当前字母出现的位置
if(it==v[t[i]-'a'].end())///如果比之前字母出现的位置要大则符合条件 要小即找不到
{
flag=1;
break;
}
pos=*it;///更新pos的值
}
if(flag)
cout << "NO" << endl;
else
cout << "YES" << endl;
}
return 0;
}