首页 > 其他分享 >P7469 [NOI Online 2021 提高组] 积木小赛

P7469 [NOI Online 2021 提高组] 积木小赛

时间:2024-09-12 09:26:13浏览次数:11  
标签:P7469 匹配 NOI int ui64 cin 小赛 Online 字符串

题目

给定两个字符串,在字符串 \(a\) 中找子序列,在 \(b\) 中找一个子串,询问有多少个子序列与子串相等,重复的字符串算一次。

思路

匹配和去重,想到哈希。

匹配,想到双指针。

每次枚举将要匹配的 \(b\) 数组的左端点,双指针匹配 \(a\) 数组,如果成功,那么将 \(b[i, j]\) 这一段的哈希值放入 vector,最后将 vector 排序 + 去重即可。

代码

#include <bits/stdc++.h>

using namespace std;
using ui64 = unsigned long long;

const int N = 3010;

ui64 base = 13331;

int n;
string a, b;
ui64 z[N], h[N];

ui64 query(int l, int r) {
    return h[r] - h[l - 1] * z[r - l + 1];
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    cin >> n;
    cin >> a >> b;
    a = ' ' + a;
    b = ' ' + b;

    h[0] = z[0] = 1;
    for (int i = 1; i <= n; i++) h[i] = h[i - 1] * base + b[i];
    for (int i = 1; i <= n; i++) z[i] = z[i - 1] * base;

    vector<ui64> res;
    for (int i = 1; i <= n; i++) {
        int r = -1;
        for (int j = i; j <= n; j++) {
            do {
                r++;
            } while (a[r] != b[j] && r <= n);
            if (r <= n) res.push_back(query(i, j));
        }
    }
    
    sort(res.begin(), res.end());
    res.erase(unique(res.begin(), res.end()), res.end());
    cout << res.size() << '\n';
    return 0;
}

标签:P7469,匹配,NOI,int,ui64,cin,小赛,Online,字符串
From: https://www.cnblogs.com/Yuan-Jiawei/p/18409531

相关文章

  • 9.11 模拟赛(炼石计划 11 月 05 日 NOIP 模拟赛 #17)
    炼石计划11月05日NOIP模拟赛#17【补题】-比赛-梦熊联盟(mna.wang)概况预计\(50+[20,36]+20+10=[100,116]\)。实际\(35+36+20+0=91\)。挂飞了/qq最后补题\(50+100+20+10=180\)。T2用std跑了较大数据终于找到了规律!!!T1是笛卡尔树的高级应用,于是先学一手......
  • [NOIP2021] 方差
    链接鉴于\(luogu\)经常似,这里把\(Markdown\)粘过来了题目[NOIP2021]方差题目描述给定长度为\(n\)的非严格递增正整数数列\(1\lea_1\lea_2\le\cdots\lea_n\)。每次可以进行的操作是:任意选择一个正整数\(1<i<n\),将\(a_i\)变为\(a_{i-1}+a_{i+1}......
  • [NOIP 2024 模拟1]zyc大吃特吃
    [NOIP2024模拟1]zyc大吃特吃题意给出两个序列\(a,b\),给出两个数\(A,B\)。求最多选出多少个数,使得刚好不满足\(\suma_i\leA\)且\(\sumb_i\leB\)。思路先考虑暴力dp,定义\(dp_{i,j}\)表示选出的数\(a\)的和等于\(i\),选出的数\(b\)的和等于\(j\),最多选出的数......
  • [NOIP 2024 模拟1]zyc不能大吃特吃
    [NOIP2024模拟1]zyc不能大吃特吃题意给出两个序列\(a,b\),给出两个数\(A,B\)。求最少选出多少个数,使得刚好不满足\(\suma_i\leA\)且\(\sumb_i\leB\)。思路贪心,\(A\)和\(B\)有一个超出即可。将序列分别按\(a\)和\(b\)排序,看那个能选的最少。代码#include......
  • [NOIP 2024 模拟1]xuan大唱特唱
    [NOIP2024模拟1]xuan大唱特唱题意给定\(n\)个点,第\(i\)个点坐标为\(x_i\)。有\(q\)次询问,每次给定\(b_i,k_i\)。求离坐标为\(b_i\)的点第\(k_i\)近的点与\(b_i\)的距离。思路二分答案\(d\),考虑如何判断。若与\(b_i\)的距离小于\(d\)的点的个数小于\(......
  • NOIP 2018 普及组初赛试题及解析(第三部分:阅读程序写结果(1-4))
    阅读程序一代码:#include<stdio.h>charst[100];intmain(){scanf("%s",st);for(inti=0;st[i];++i){if('A'<=st[i]&&st[i]<='Z')st[i]+=1;}printf("%s\n&quo......
  • NOIP 2018 普及组初赛试题及解析(第二部分:问题求解(1-2))
    分享代码:#include<iostream>usingnamespacestd;//函数用于检查一个数是否包含数字8boolcontainsEight(intnum){while(num>0){if(num%10==8)returntrue;//如果当前个位数是8,则返回truenum/=10;//去掉当前......
  • NOIP2022 游记
    NOIP2022游记突然想起来两年前的一篇游记没写,现在好像也已经很难再回忆起什么了,但我的OI生涯中也就这两场比赛,总得留下点什么来让日后回味这段充满热血的时光。Background坐标sc弱校,文化课不顶尖,但在年级上还算比较强,停课之前大概能维持在年级前\(25\)的样子。不是那种......
  • 【转载】mx noip day2 sol
    T1捏捏这个题才是签到题。右边为逆序对总数。为左边的值找一个具体意义,我们将证明这个值不大于等号右边的值。考虑冒泡排序,右边即冒泡排序交换的次数(每交换一次一定减少一个逆序对)。左边一定不大于冒泡排序交换次数,因为左边的值只考虑了复原需要向左移动的数,而未考虑向右移动......
  • 「NOI2021 D1T3 庆典」题解
    uoj675加强:\(\sumk\le6\times10^5\)暴力\(u\)在\(s\Rightarrowt\)路径上\(\iff\)正图上\(s\Rightarrowu\)且反图上\(u\Rightarrowt\)时间复杂度\(O((n+m)q)\)正解只关心可达性,不妨SCC缩点成DAG。注意到一个奇怪的条件:对于三座城市\(x,y,z\),若\(x\Right......