首页 > 其他分享 >「模拟赛」多校 A 层冲刺 NOIP 24

「模拟赛」多校 A 层冲刺 NOIP 24

时间:2024-11-19 20:07:09浏览次数:1  
标签:24 前缀 NOIP int 多校 后缀 字符串 pi define

A.选取字符串

KMP、字符串好题

因为所有字符串都是大字符串的前缀,所以一旦我们每个字符串的前缀后缀的长度确定了,那么前缀后缀长什么样也就确定了

设 \(f_i\) 为所有相同前缀后缀长度可以为 \(i\) 的字符串的个数

我们枚举 \(i\in [1,n]\),每次钦定两个串 \(p、q\) 里必须有一个是 \(S_i\),而另一个串可以在合法的范围内任意选。

设 \(g_i\) 表示必选前缀串 \(S_i\) 时另一个串可以选的字符串的个数

那么答案就是 \(\sum_{i=1}^n \binom {f_i}{k}\times (2\times g_i-1)\) + \(\binom {n+1}{k}\)

Why:另一个串有 \(g_i\) 种可能,而 \(p、q\) 的顺序不同为不同的方案,所以乘 2,再减去 \(p、q\) 都选 \(S_i\) 的情况(这个情况 \(p、q\) 顺序不同也是一种方案)
最后 \(p、q\) 全选空串的方案单独算即为 \(n+1\) 个串里选 \(k\) 个

现在考虑 \(f_i、g_i\) 的计算:

  • 对于 \(f_i\):KMP 求出所有字符串 \(S_{[1,i]}\) 的 包的er 值 \(pi_i\),即最长的既是前缀也是后缀的长度,那么每个字符串 \(S_i\) 相同前缀后缀可以为 \(S_{[1,\ pi_i]}\),同时也可以为 \(S_{[1,\ pi_i]}\) 的前缀后缀,所以从大到小递推计算:f[pi[i]] += f[i];

  • 对于 \(g_i\):显然选 \(S_i\) 时同样可以为所有字符串的前缀后缀的只能是 \(S_i\) 的前缀后缀,也是同理递推得到,g[i] += g[pi[i]];

code
#include<bits/stdc++.h>
#define int long long
#define Aqrfre(x, y) freopen(#x ".in", "r", stdin),freopen(#y ".out", "w", stdout)
#define mp make_pair
#define Type int
#define qr(x) x=read()
typedef long long ll;
using namespace std;

inline Type read(){
    char c=getchar(); Type x=0, f=1;
    while(!isdigit(c)) (c=='-'?f=-1:f=1), c=getchar();
    while(isdigit(c)) x=(x<<1)+(x<<3)+(c^48), c=getchar();
    return x*f;
}

const int N = 1e6 + 5;
const int mod = 998244353;

inline vector<int> pretix(string s){
    int len = s.length();
    vector<int>v(len+10); v[0] = 0;
    for(int i=1; i<len; i++){
        int j = v[i-1]; //v: The length of the string which from 1 to i - 1
        while((i == j or s[i] != s[j]) and j) j = v[j-1];
        if(s[i] == s[j]) j++;
        v[i] = j;
    }
    return v;
}

string s;
int n, k, sum[N], f[N], g[N];
vector<int>pi;

int fact[N], inv[N], fainv[N];
inline void AqrPre(){
    fact[0] = fact[1] = 1;
    inv[0] = inv[1] = 1;
    fainv[0] = fainv[1] = 1;
    for(int i=2; i<=n+3; i++){
        fact[i] = 1ll * fact[i-1] * i % mod;
        inv[i] = 1ll * inv[mod%i] * (mod - mod / i) % mod;
        fainv[i] = 1ll * fainv[i-1] * inv[i] % mod;
    }
}

inline int C(int x, int y){
    return x < y ? 0 : 1ll * fact[x] * fainv[y] % mod * fainv[x-y] % mod;
}

/*
思路应该是显然的??实现也简单啊只不过我假了一版又一版

那这题确实是简单签到了啊,但我打了两个半小时??

还有救么??这让我怎么翻?后面三题只打暴力肯定不行吧
*/

signed main(){ // string
    Aqrfre(string, string);

    qr(k); cin>>s; n = s.length();
    AqrPre(); pi = pretix(s);

    for(int i=0; i<n; i++) f[pi[i]]++, g[i+1] = 1;
    for(int i=1; i<=n; i++) g[i] += g[pi[i-1]];

    for(int i=n; i>=1; i--)
        if(i and pi[i-1]) f[pi[i-1]] += f[i];

    int ans = 0;
    for(int i=1; i<=n; i++){
        ans += C(f[i]+1, k) * ((g[i] + 1) * 2 - 1) % mod;
        ans %= mod;
    }
    cout<<(ans+C(n+1, k))%mod<<"\n";



    return 0;
}

B.取石子

C.均衡区间

D.禁止套娃

标签:24,前缀,NOIP,int,多校,后缀,字符串,pi,define
From: https://www.cnblogs.com/YuenYouth/p/18555372

相关文章

  • NOIP模拟赛 #14
    A给定\(n,a_{0\dotsn-1}\),满足\(\foralli,|a_i-n|\le1\)。对于\(i\gen\)满足\(a_i=\sum\limits_{j=0}^{i-1}[j+a_j\gei]\),\(q\)次询问给定\(k\),求\(a_k\)的值。\(1\len,q\le10^5,\0\lek\le10^{15}\)考虑\(a_i\get......
  • 724. 寻找数组的中心下标
    题目自己写的classSolution{public:intpivotIndex(vector<int>&nums){intn=nums.size();vector<int>s(n,0);s[0]=nums[0];for(inti=1;i!=n;++i)s[i]=s[i-1]+nums[i];......
  • 20222408 2024-2025-1 《网络与系统攻防技术》实验五实验报告
    1.实验内容1.1实验要求(1)选择一个DNS域名进行查询,获取如下信息:DNS注册人及联系方式、该域名对应IP地址、IP地址注册人及联系方式、IP地址所在国家、城市和具体地理位置。(2)尝试获取QQ中某一好友的IP地址,并查询获取该好友所在的具体地理位置。(3)使用nmap开源软件对靶机环境进行扫......
  • 24. 两两交换链表中的节点
    https://leetcode.cn/problems/swap-nodes-in-pairs/?envType=study-plan-v2&envId=top-100-liked对于我们正常交换单向链表的两个节点我们需要知道三个节点的信息,1.对于a->b->c,我们要交换a、b就要知道a、b、c三个节点,因为我们需要将a的next指向c,将b的next指向a,由于b->c这条......
  • 2024年11月一区SCI-逃离优化算法Escape Algorithm-附Matlab免费代码
    引言本期介绍了一种受人群疏散行为的启发的元启发式优化算法,称为逃离优化算法EscapeAlgorithm,ESC。该算法于2024年11月最新发表在JCR1区,中科院2区TopSCI期刊 ArtificialIntelligenceReview。ESC的灵感来自于人们在紧急疏散期间的行为。本节解释人群疏散系统的背景,以及......
  • SS241119C. 甜果(sugar)
    SS241119C.甜果(sugar)题意有\(n\)个人,每个人初始有\(a_i\)颗糖果,有\(n\)个事件,事件\(i\)是如果\(a_i>a_{b_i}\),那么\(a_i':=a_i+w_i\)。问所有事件以随机的排列的顺序依次发生后,每个人的期望糖果数量。思路即求每个事发生的概率\(p_i\),那么\(ans_i=a_i......
  • [考试记录] 2024.11.19 noip模拟赛17
    T1选取字符串warning❗:本题解前缀含量过高。挺典的kmp。考虑到题目中的串都是一个串的前缀,那么所选出来的串,他们的前缀一定是最短的那个串。不妨直接枚举每一个前缀,也就是枚举每一个串,看他们是否可以作为前缀出现,hash即可,复杂度\(\mathcal{O}(N^2)\)。换个思路,考虑有多......
  • 多校A层冲刺NOIP2024模拟赛24
    多校A层冲刺NOIP2024模拟赛24\(T1\)A.选取字符串\(100pts\)考虑建出失配树,然后等价于询问\(\sum\limits_{S\sube\{0,1,2,\dots,n\},|S|=k}dep_{\operatorname{LCA}\{S\}}^{2}\)。不妨从\(\operatorname{LCA}\)的角度考虑,统计\(x\)能作为多少个\(|S|\)......
  • 2024/11/19
    队列应用(蓝桥杯)分数10作者liudan单位石家庄铁道大学CLZ银行只有两个接待窗口,VIP窗口和普通窗口,VIP用户进入VIP窗口排队,剩下的进入普通窗口排队。现有M次操作,操作有四种类型,如下:INnameV:表示一名叫name的用户到VIP窗口排队OUTV:表示VIP窗口队头的用户离开......
  • noip模拟17
    A选取字符串会\(n^2\)。直接枚举全部的\(q,p\)然后开一个二维的bitset去存一个数是否是某个数的前后缀。选到两个\(p,q\)时把这两个数的bitset与起来,贡献是\(\binom{count}{k}\)。正解就是先用kmp去求出来全部的border,然后用border关系建一棵树,这棵树上满足......