首页 > 其他分享 >[冲刺国赛2022] 模拟赛15

[冲刺国赛2022] 模拟赛15

时间:2022-08-14 16:24:31浏览次数:63  
标签:字符 cnt 15 int 国赛 Ins dfn 2022 out

子串

题目描述

定义 \(cnt(s,t)\) 表示 \(t\) 在 \(s\) 中的出现次数。对于字符串 \(s\),定义一个子串 \(t\) 是重要的,当且仅当对于任意以 \(t\) 为子串的 \(t'\),都满足 \(cnt(s,t')<cnt(s,t)\)

给定串 \(S\),对于 \(S\) 的每个前缀求出,把这个前缀当成 \(s\) 时,重要串有多少个。

\(|S|\leq 10^6\),字符集 0~9

解法

考虑判断条件可以转化成:在 \(t\) 的前面或者后面加一个字符得到 \(t'\),\(t'\) 的出现次数不能等于 \(t\)

如果只考虑在前面加入字符,那么答案就是后缀自动机的节点数,可以在构建后缀自动机的时候得到个数。

再考虑在后面加入字符,如果某种节点的转移边只有一种的话,走这条转移边所得的 \(t'\) 出现次数会等于 \(t\),但是对于存在下一个字符为空的串 \(t\) 一定是重要的,这是一种不符合上面条件的特殊情况。

所以我们维护转移边出度为 \(1\) 的点数,用 \(\tt dfn\) 序和树状数组来维护链,就可以计算答案,时间复杂度 \(O(n\log n)\)

#include <bits/stdc++.h>
using namespace std;
const int M = 2000005;
int read()
{
	int x=0,f=1;char c;
	while((c=getchar())<'0' || c>'9') {if(c=='-') f=-1;}
	while(c>='0' && c<='9') {x=(x<<3)+(x<<1)+(c^48);c=getchar();}
	return x*f;
}
int n,cnt,last,Ind,res,b[M],ans[M];
int dfn[M],siz[M],out[M];char s[M];
vector<int> g[M];vector<pair<int,int>> v[M];
struct node{int ch[10],fa,len;}a[M<<1];
void add(int id,int c)
{
    int p=last,np=last=++cnt;
    a[np].len=a[p].len+1;
    for(;p && !a[p].ch[c];p=a[p].fa)
    {
        a[p].ch[c]=np;out[p]++;
        v[id].push_back(make_pair(p,1));
    }
    if(!p) a[np].fa=1;
    else
    {
        int q=a[p].ch[c];
        if(a[p].len+1==a[q].len) a[np].fa=q;
        else
        {
            int nq=++cnt;a[nq]=a[q];
            a[nq].len=a[p].len+1;out[nq]=out[q];
            v[id].push_back(make_pair(nq,out[nq]));
            a[np].fa=a[q].fa=nq;
            for(;p && a[p].ch[c]==q;p=a[p].fa)
                a[p].ch[c]=nq;
        }
    }
}
void dfs(int u)
{
    dfn[u]=++Ind;siz[u]=1;
    for(int v:g[u])
        dfs(v),siz[u]+=siz[v];
}
//
void ins(int x,int c)
{
    for(int i=x;i<=cnt;i+=i&(-i))
        b[i]+=c;
}
int ask(int x)
{
    int r=0;
    for(int i=x;i>0;i-=i&(-i))
        r+=b[i];
    return r;
}
void Ins(int l,int r,int c)
{
    ins(l,c);ins(r+1,-c);
}
void upd(int x,int y)
{
    if(out[x]==1)
        Ins(dfn[x],dfn[x]+siz[x]-1,-1),res--;
    out[x]+=y;
    if(out[x]==1)
        Ins(dfn[x],dfn[x]+siz[x]-1,1),res++;
}
signed main()
{
    freopen("string.in","r",stdin);
    freopen("string.out","w",stdout);
    n=read();scanf("%s",s+1);
    last=cnt=1;
    for(int i=1;i<=n;i++)
        add(i,s[i]-'0'),ans[i]=cnt-1;
    for(int i=2;i<=cnt;i++)
        g[a[i].fa].push_back(i);
    dfs(1);
    for(int i=1;i<=cnt;i++) out[i]=0;
    for(int i=1,p=1;i<=n;i++)
    {
        p=a[p].ch[s[i]-'0'];
        for(auto x:v[i])
            upd(x.first,x.second);
        ans[i]+=ask(dfn[p])-res;
    }
    for(int i=1;i<=n;i++)
        printf("%d ",ans[i]);
}

标签:字符,cnt,15,int,国赛,Ins,dfn,2022,out
From: https://www.cnblogs.com/C202044zxy/p/16585613.html

相关文章

  • 2022高考集训2
    2022高考集训2 我在6号早上冷水洗澡加跑操,那水冷到什么程度,我把校服衬衫穿到身上的时候感受到一股温暖就离谱。但是没办法,我这每天洗澡已经是一种病态的生活习惯了,我这......
  • 20220814 idea_springboot_启动 Cannot load driver class: com.mysql.cj.jdbc.
    1问题Cannotloaddriverclass:com.mysql.cj.jdbc.Driver 2解决方案2.1已解决2.1.1首先,去查看项目中MySQL的版本如果找不到,说......
  • 20220814 idea_SpringBoot_启动 jpa 启动 Access to DialectResolutionInfo canno
    1问题AccesstoDialectResolutionInfocannotbenullwhen'hibernate.dialect'notset 2解决方案2.1未解决直接用这个问题搜索,使用了很......
  • day 15 面向对象
    面向对象概述面向对象是一种编程思想(oop),他是将对应的过程替换成对应的对象,而不做去追求对应的过程实现,而通过去找对象的方式实现。综合思想:找有这个功能的对象,做这个事情......
  • Vulfocus靶场 | elasticsearch 代码执行 (CVE-2015-1427)
    一、漏洞简介CVE-2014-3120后,ElasticSearch默认的动态脚本语言换成了Groovy,并增加了沙盒,但默认仍然支持直接执行动态语言。本漏洞:1.是一个沙盒绕过;2.是一个Goovy代码执......
  • 2022.8.14 NPM包管理器与Babel
    04、NPM包管理器4.1、简介官方网站:https://www.npmjs.com/ NPM全称NodePackageManager,是Node.js包管理工具,是全球最大的模块生态系统,里面所有的模块都是开源免费的;也......
  • 2022.8.14 模块化、Webpack、Vue-element-admin
    06、模块化相当于形成包6.1、简介模块化产生的背景随着网站逐渐变成”互联网应用程序”,嵌入网页的Javascript代码越来越庞大,越来越复杂。Javascript模块化编程,已经成......
  • 2022.8.17 vscode与nodejs
    大前端01、概述和前端工具vscode安装1.1、下载安装VScode下载地址:https://code.visualstudio.com/   1:双击打开vscode安装包2:指定安装目录     ......
  • freee Programming Contest 2022(AtCoder Beginner Contest 264)A-E
    freeeProgrammingContest2022(AtCoderBeginnerContest264)https://atcoder.jp/contests/abc264FG待补A-"atcoder".substr()输出atcoder第L位和第R位上的字符#in......
  • 2022.8.14 ES6
    03、Es63.1、ES6的概述  ECMAScript的快速发展:  编程语言JavaScript是ECMAScript的实现和扩展。ECMAScript是由ECMA(一个类似W3C的标准组织)参与进行标准化的......