首页 > 其他分享 >【NOIP模拟赛】制胡窜 题解

【NOIP模拟赛】制胡窜 题解

时间:2022-11-24 20:35:12浏览次数:47  
标签:le 匹配 NOIP int 题解 sum dept num 制胡窜

今天浅试了一下vscode的typora插件和cnblog插件,这篇文章是typora插件编写,cnblog插件发布的

Problem

题目描述

给你两个字符串 \(S\) 和 \(T\) ,有 \(q\) 次询问,每次询问给定一个 \(k\) 。

对于每次询问,你需要输出至少多少个 \(S\) 拼起来才能不为 \(k\) 个 \(T\) 拼起来的子序列

注意是子序列!!! 吐槽:考试的时候因为看成子串了所以浪费了半天。

输入格式

第一行一个整数 \(q\)。

第二行 \(S\)

第三行 \(T\)

接下来 \(q\) 行,每行一个正整数 \(k\) 。

输出格式

\(q\) 行,对于每次询问输出题目要求输出的值。

数据范围

\[对于 100\% 的数据,1\le n,m\le 5000,1\le q\le 3\times 10^5,1\le k\le 10^{14} \]

Solution

考虑从 \(S\) 串的每个位置开始,匹配一遍 \(T\) 串做出的贡献。例如对以下样例的两个串匹配:

3
abaab
abaabacaba
1
3
4

对于 \(S\) 串从第 \(1\) 个位置开始匹配,匹配一遍 \(T\) 串做出的贡献是一个子序列+\(S\) 的前三个字符。

这样可以 \(O(nm)\) 的预处理出来从 \(S\) 每个位置开始匹配一遍 \(T\) 做出的贡献。

然后完美可以把从每个位置开始匹配的状态看作一个点,由于从 \(1\) 开始匹配后做出的贡献是一个子序列+\(S\) 的前三个字符,故下一次匹配 \(T\) 的时候是从第 \(4\) 号位置开始匹配的,所以我们将 \(1\) 号点向 \(4\) 号点连一条单向边,同理我们可以建出来一个图。不难发现因为每一个点都有一条延申出去的单向边,故,此图存在一个环,如下图:

img

我们可以做一个类似于图上前缀和的东西,因为最初匹配是从 \(1\) 为起点开始匹配的,所以 \(1\) 号点作为根节点,然后做图上前缀和,前缀贡献。然后我们可以求出没有进入环的部分点数和环的部分点数。

对于每次询问 \(k\) 。我们可以分为两种种情况讨论

  • \(k<没有进入环的部分的点数\)
  • \(k > 进入环的部分点数\)

对于第二种情况,还要算最后环中余下点的贡献。

这么讲可能有点抽象,具体更具代码理解会更透彻。

CODE

#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=5e3+7;
int Q;
int n,m;
string S,T;
int nxt[N],sum[N];
bool vis[N];
int pre_sum,nt_sum[N],lent,be,dep[N];
int num[N];
void dfs(int u,int dept){
    dep[u]=dept;
    num[dept]=num[dept-1]+sum[u];
    vis[u]=true;
    if(vis[nxt[u]]){
        be=dep[nxt[u]];
        lent=dept-be+1;
        pre_sum=num[be-1];nt_sum [0]=num[dept]-pre_sum;
        return;
    }
    dfs(nxt[u],dept+1);
    if(dept>=be){
        int ltt=dept-be+1;
        nt_sum[ltt]=num[dept]-pre_sum;
    }
}
signed main(){
    clock_t st,ed;
    st=clock();
    freopen("string.in","r",stdin);
    freopen("string.out","w",stdout);
    scanf("%lld",&Q);
    cin>>S>>T;
    n=S.length();m=T.length();
    for(int i=1;i<=n;++i){
        int idt=i-1;
        for(int j=1;j<=m;++j){
            if(S[idt%n]==T[j-1]){
                idt++;
            }
        }
        idt;
        sum[i]=(idt)/n;
        nxt[i]=(idt)%n+1;
    }
    dfs(1,1);
    while(Q--){
        int k;
        scanf("%lld",&k);
        int ans=0;
        if(k<be-1){
            printf("%lld\n",num[k]+1);
            continue;
        }
        else{
            ans+=pre_sum;k-=(be-1);
            ans+=(nt_sum[0]*(k/lent));
            k%=lent;
            if(k){
                ans+=nt_sum[k];
            }
            printf("%lld\n",ans+1);
        }
    }
    ed=clock();
    return 0;
}

标签:le,匹配,NOIP,int,题解,sum,dept,num,制胡窜
From: https://www.cnblogs.com/I-am-yzh/p/16923135.html

相关文章

  • Clock题解
    Clock题意:给一些时间,24小时制,给一个初始出发时间,问在钟表上最少转多少度能把所有给的时间都经历一遍。思路:分四种情况模拟。注意:求的是度数,所以最后要乘6转换。3:00,转......
  • CSP-2022-J 复赛题解
    \(\large\texttt{T1P8813[CSP-J2022]乘方}\)原题链接#include<iostream>#include<cstdio>#defineintlonglongusingnamespacestd;inta,b,c;intpow(int......
  • NOIP 2022 游记
    前言广告位招租背景/Day-INF高一,第一场正式的NOIp(初中生不给算),仔细一想也是倒数第二场(惊恐)。几周前的CSP考了220分,几乎是本校(停课选手中)最低的。应该说有偶然成分,但是......
  • 2022NOIPA层联测34
    A.bs串只知道去找环然后挨个判断……正解是把不同色的边连上,枚举哪两个同色的边两端已经联通。二分+并查集。code#include<bits/stdc++.h>usingnamespacestd;......
  • IDEA编辑器下Vue项目中Element标签出现标黄(Unknown html tag el-form)问题解决方案!
      第一步:检查配置中的依赖项是否勾选,如未勾选则勾上  第二步:检查配置中的Excludes项,如果有被排除的项目则删除  第三步:执行npminstall后,在node_modul......
  • NOIP2022 游记
    NOIP2022游记Hello,hello,helloworld.Iopenmyeyesandsaidhellototheworld.——《HelloWorld》Day-2被hh的神秘模拟赛打自闭了。2hard4me.希望......
  • Codeforces Round #418 (Div. 2) D. An overnight dance in discotheque 题解
    圆由于没有相交,之间的关系要么毫无关系,要么就是包含,所以能形成树。直接包含的就是父节点。如果只有一组,不分前半夜后半夜的话,那么舒适度就是每棵树的根节点(深度为0)面积......
  • Unknown column 'c.name' in 'field list'问题解决
    第二次碰到这个问题,记录一下问题原因和解决;  c.name这个从tal_sss_camera_info这个表里面找不到,因为tal_sss_camera_info这个表里面没有name这个字段。  如上图......
  • luogu1253 [yLOI2018] 扶苏的问题 题解
    扶苏的问题题目题目描述给定一个长度为\(n\)的序列\(a\),要求支持如下三个操作:给定区间\([l,r]\),将区间内每个数都修改为\(x\)。给定区间\([l,r]\),将区间内每......
  • 洛谷P2141 [NOIP2014 普及组] 珠心算测验
    [NOIP2014普及组]珠心算测验题目描述珠心算是一种通过在脑中模拟算盘变化来完成快速运算的一种计算技术。珠心算训练,既能够开发智力,又能够为日常生活带来很多便利,因而......