bzoj 3473: 字符串 (后缀自动机)_clover_hxy的博客-程序员宝宝

技术标签: 后缀自动机  

题目描述

传送门

题目大意:给定n个字符串,询问每个字符串有多少子串(不包括空串)是所有n个字符串中至少k个字符串的子串?

题解

同bzoj3277

代码

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#define N 200003
#define LL long long
using namespace std;
int tot,n,k,point[N],nxt[N],v1[N],ch[N][30],fa[N],c[N];
int v[N],pos[N],l[N],mark[N],cnt,root,last,np,q,p,nq,head[N],next[N];
char s[N];
LL ct[N],ans[N];
void add(int x,int y)
{
    tot++; nxt[tot]=point[x]; point[x]=tot; v1[tot]=y;
}
void extend(int x,int col)
{
    int c=s[x]-'a'+1; np=++cnt;
    p=last; last=np; l[np]=l[p]+1;
    for (;!ch[p][c]&&p;p=fa[p]) ch[p][c]=np;
    if (!p) fa[np]=root;
    else {
        q=ch[p][c];
        if (l[p]+1==l[q]) fa[np]=q;
        else {
            nq=++cnt; l[nq]=l[p]+1;
            memcpy(ch[nq],ch[q],sizeof(ch[nq]));
            fa[nq]=fa[q]; mark[nq]=mark[q]; ct[nq]=ct[q];
            fa[q]=fa[np]=nq;
            for (;ch[p][c]==q;p=fa[p]) ch[p][c]=nq;
        }
    }
    add(col,np);
    for (;np;np=fa[np])
     if (mark[np]!=col) {
        mark[np]=col; 
        ct[np]++;
     }
     else break;
}
void build(int x,int y)
{
    tot++; next[tot]=head[x]; head[x]=tot; v[tot]=y;
}
void dfs(int x)
{
    for (int i=head[x];i;i=next[i]){
        ans[v[i]]+=ans[x];
        dfs(v[i]);
    }
}
int main()
{
    freopen("a.in","r",stdin);
    scanf("%d%d",&n,&k);
    root=++cnt;
    for (int i=1;i<=n;i++) {
        scanf("%s",s+1); int len=strlen(s+1);
        last=root;
        for (int j=1;j<=len;j++) extend(j,i);
    }
    for (int i=1;i<=cnt;i++) v[l[i]]++;
    for (int i=1;i<=cnt;i++) v[i]+=v[i-1];
    for (int i=1;i<=cnt;i++) pos[v[l[i]]--]=i;
    tot=0;
    for (int i=1;i<=cnt;i++) {
        int t=pos[i];
        build(fa[t],t);
        ans[t]=(ct[t]>=k?l[t]-l[fa[t]]:0);
    }
    c[1]=0;
    dfs(1);
    for (int i=1;i<=n;i++) {
        LL sum=0;
        for (int j=point[i];j;j=nxt[j])
         sum+=ans[v1[j]];
        printf("%lld ",sum);
    }
    printf("\n");
}
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/clover_hxy/article/details/67633838

智能推荐

从零开始学android编程!来一份全面的面试宝典练练手,系列教学_普通网友的博客-程序员宝宝

职业生涯规划Android系统的市场地位Android程序开发的技能成长经验Android程序员为什么需要学习Html5Android软件工程师为什么不会被前端替代为什么小程序无法替代原生开发为什么Html5无法取代NativeAPPHtml5在Android中的应用场景如何成为一名合格的高级Android程序员1、应用层开发,不限于各种产品,主要还是Android或iOS原生开发,主要是各种性能优化。2、嵌入式开发,不限于各种开发板子,物联网,智能家居3、安全开发,不限于各种反逆向

【数据库】【课程设计】商品销售信息管理系统设计_商品销售管理系统设计_哎呀,何必呢的博客-程序员宝宝

商品销售信息管理系统设计1.设计目的2.需求分析2.1系统业务分析2.2系统数据处理分析2.3系统数据字典3.系统设计3.1系统开发框架3.2系统功能组成设计3.2.1 系统功能组成3.2.2 子系统功能模块设计3.3数据库结构设计3.3.1 商品管理系统的对象/实体3.3.2 概念模型转换为关系模型3.3.2 定义关系模型4.数据库实施与数据准备4.1数据库实施4.2数据准备5.系统功能模块设计与开发5.1模块划分5.2系统功能模块设计与开发5.2.1 登录模块5.2.2 插入订单5.2.3 删除订单5.

yii2url地址后面加上.html,Yii2 URL路由规则设置过程详解_weixin_39639040的博客-程序员宝宝

在实际上线时候肯定要自定义规则好利于SEO或者浏览,以及精简URL的长度等等。我们就需要设置URL的规则了,YII2配置就不多说了。'urlManager'=&gt;['enablePrettyUrl'=&gt;true,//路由的路径化'showScriptName'=&gt;false,'suffix'=&gt;'.html',//后缀'rules'=&gt;[//为...

mac10.9+php5.5.15+brew0.9.5的安装_dianbutang4605的博客-程序员宝宝

Brew 是 Mac 下面的包管理工具,通过 Github 托管适合 Mac 的编译配置以及 Patch,可以方便的安装开发工具。 Mac 自带ruby 所以安装起来很方便,同时它也会自动把git也给你装上。官方网站: http://brew.sh安装方法:?1ruby -e "$(curl -fsSL http...

linux中查看库依赖文件,linux下查看程序依赖的库_高分子科学前沿的博客-程序员宝宝

在x86下,为了查看程序所依赖的库,可以使用但如果是使用arm-linux-gcc 等交叉编译环境编译出来的程序,则要使用库用于将相似函数打包在一个单元中。然后这些单元就可为其他开发人员所共享,并因此有了模块化编程这种说法 — 即,从模块中构建程序。Linux 支持两种类型的库,每一种库都有各自的优缺点。静态库包含在编译时静态绑定到一个程序的函数。动态库则不同,它是在加载应用程序时被加载的,而且它...

程序员笔试题----链表的stable_partition_wutao02的博客-程序员宝宝

最近腾讯笔试了一道关于链表partition的题,要求稳定性,当时没有做出来。现在思考了一下,其实不难。只需要根据partition要求分别建立两个链表,然后遍历原链表,调整每个节点的链接即可。时间复杂度为O(n)空间复杂度为O(1)

随便推点

PageHelper分页时查询结果重复问题_weixin_43831120的博客-程序员宝宝

问题描述PageHelper进行分页时,如果排序字段不唯一或者可能为空,那么就可能出现查询结果在不同页中有重复的数据,部分数据也因此查询不出来。这个bug似乎不一定百分百的出现,但是出现的概率非常的大。解决办法所以,如果要排序的字段的值不是唯一的,那么必须加上具备唯一性的主键id(或其他唯一性字段)作为辅助排序,这样就能避免查询结果重复。...

node+express+ajax实现get和post请求_张小益达的博客-程序员宝宝

get请求获取数据:首先得知道的是,发送get请求,响应的参数会显示在URL后面,所以可以通过解析URL来获取前台传过来的信息,这里需要注意的是,如果在URL连接中含有中文,传过来显示会有乱码,解决方法就是:url.parse(req.url,true),传入第二个参数为true,就能保证正确显示了。//需要用到的组件var express = require("express");...

Python 开发轻量级爬虫_Famiglistimo_的博客-程序员宝宝

第一章 爬虫简介爬虫 : 一段自动抓取互联网信息的程序爬虫技术的价值 : 使得互联网的数据更好的发挥作用第二章 简单爬虫架构简单爬虫架构爬虫调度端 : 启动 , 停止或监视爬虫URL管理器 : 对待爬取的URL和已经爬取的URL进行数据的管理网页下载器 : 对待爬取的网页进行下载 , 形成字符串 , 字符串传送给网页解析器网页解析器 : 首先解析出有价值的数据 , 其次解析后...

sysadmn分配职责后看不到_不是当前用户的有效责任_长烟慢慢的博客-程序员宝宝

XXX 不是当前用户的有效责任,请联系您的系统管理员  有时进入一些基于Web页面时,会出现这种现象:  XXX  不是当前用户的有效责任,请联系您的系统管理员 ( or: xxx is not a valid responsibility for the current user. Please contact your System Administrator)   解决方式: 方法1:重启

经典算法之Viola-Jones检测器_为伊憔悴的博客-程序员宝宝

之前的专业方向为图像标注与检索,而最近关注的重点开始向计算机视觉方面倾斜。

推荐文章

热门文章

相关标签