题意
构造长度为mmm的字符串XXX,满足两个条件
- 该字符串不能是SSS的子序列
- 该字符串的第iii位,需要满足L[i]<=X[i]<=R[i]L[i] <= X[i] <= R[i]L[i]<=X[i]<=R[i]
思路
对于字符串X[i]X[i]X[i],其可能出现SSS的下标范围i<=k<=ji <= k <= ji<=k<=j,对于其下一位,需要尽可能让下一位选择的空间尽量的小。 直接暴力枚举即可。
复杂度分析
如果出现012345678901234567890123456789
这种 就会导致程序多遍历了4.5次
∣S∣<=3e5,∣m∣<=10|S|<=3e5, |m|<=10∣S∣<=3e5,∣m∣<=10,因此最坏情况下1e7,刚好卡在上限
可以维护个Next[i][j]Next[i][j]Next[i][j]的索引,计算从iii开始,下个字符串jjj的下标。
代码
void solve()
{
string s, a, b;
int m;
cin >> s >> m >> a >> b;
int n = s.size();
int lMax = 0;
for (int i = 0; i < m; i++)
{
int mx = lMax;
for (char j = a[i]; j <= b[i]; j++)
{
int k = s.find(j, lMax);
if (k != std::string::npos)
{
mx = max(mx, k + 1);
}
else
{
cout << "YES\n";
return;
}
}
lMax = mx;
}
cout << "NO\n";
}