链接:Educational Codeforces Round 151 (Rated for Div. 2):C. Strong Password
题意:给定三个字符串s,l,r。其中l和r的长度为m,找到一个字符串ans满足以下条件:
长度为m,l[r]<=ans[i]<=r[i],且ans不是字符串s的一个子序列。
题解:可以发现如果在枚举ans[i]时没有在s中找到,那么答案肯定为yes,如果找到了,每次选取应该找s中第一次出现最右边的位置字符,这样可以使得后面选取字符时,找到一个子序列的概率越来越小。
代码如下:
#include<iostream>
#include<algorithm>
#include<vector>
#include<map>
#include<unordered_map>
#include<queue>
#include<stack>
#include<string>
#define inf 0x3f3f3f3f
#define PII pair<int,int>
#define fi first
#define se second
#define ll long long
using namespace std;
void solve()
{
int m;
string s,l,r;
cin >>s>>m>>l>>r;
int cur=0;
for(int i=0;i<m;i++)
{
int res=0;
for(char j=l[i];j<=r[i];j++)
{
int tem=s.find(j,cur);
if(tem==-1)
{
cout <<"YES"<<endl;return ;
}
tem++;
res=max(tem,res);
}
cur=res;
}
cout <<"NO"<<endl;
}
int main(){
int t = 1;
cin >>t;
while(t--)
{
solve();
}
return 0;
}