1845C. Strong Password

题意

构造长度为mmm的字符串XXX,满足两个条件

  1. 该字符串不能是SSS的子序列
  2. 该字符串的第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|<=10S<=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";
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值