1829: [NewOJ Week 8] 最短缺失子序列(每日一题)打卡

这篇文章介绍了如何使用C++解决一个字符串匹配问题,通过构建ne[][]数组和check函数来判断输入字符串是否能按照给定规则进行匹配。作者提到使用2进制统计字母种类并优化了时间和空间复杂度。
摘要由CSDN通过智能技术生成

 题目:

 输入
abc
abcccabac
3
cbb
cbba
cba
样例
1
0
0

 考察知识点:

思路:

参考:NewOJ Week 8题解_傅志凌的博客-CSDN博客

被 cin 卡了一下时间超限,关闭同步流就好了

代码:

'算法' ( times:1182ms ) 

#include <bits/stdc++.h>
using namespace std;
const int N = 1e6 + 10;
int ne[N][26];
string s, g;
#define IOF ios::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL);

int len()
{
    int k = 0;
    for (auto v : g)
        k |= (1 << (v - 'a')); // 用 26位二进制统计字母种数,(之前用的set,感觉2进制更方便)
    int len = 0, cnt = 0;
    for (auto v : s)
    {
        cnt |= (1 << (v - 'a'));
        if (cnt == k)
            len++, cnt = 0;
    }
    return len;
}

bool check(string a)
{
    int n = a.size();
    a = " " + a;
    int pos = 0;
    for (int i = 1; i <= n; i++)
    {
        pos = ne[pos][a[i] - 'a'];
        if (!pos) // pos等于0说明是无法匹配的
            return false;
    }
    return true;
}

signed main()
{
    IOF 
    int q;
    cin >> g >> s >> q;

    int m = len() + 1;
    int n = s.size();
    s = " " + s;
    // 预处理 · ne[][] 数组,从前面跳到当前字母s[i]
    for (int i = 1; i <= n; i++)
        for (int j = i - 1; j >= 0; j--)
        {
            ne[j][s[i] - 'a'] = i;
            // 直到找到上一个s[i]停止
            if (s[j] == s[i])
                break;
        }
    while (q--)
    {
        string a;
        cin >> a;
        int la = a.size();
        if (la != m)
            puts("0");
        else if (check(a))
            puts("0");
        else
            puts("1");
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值