【hihocoder】sam1-基本概念

这题有毒……

原本只是想复习下sam,于是写……

后来发现自己傻了不知道怎么维护endpos……

一气之下直接kmp拉倒,mdzz

UPD:现在我好像会维护endpos了……

#include<bits/stdc++.h>
#define N 100010
using namespace std;
int a[N],l,n,b[N],t,nxt[N];
struct Suffix_AutoMaton{
    int cnt,last,ch[N][26],l[N],r[N],fa[N];
    void ins(int c,int pos){
        int p=last,np=++cnt;last=np;l[np]=pos;r[np]=pos;
        for(;p&&!ch[p][c];p=fa[p])ch[p][c]=np;
        if(!p)fa[np]=1;
        else{
            int q=ch[p][c];
            if(l[p]+1==l[q])fa[np]=q,r[q]=pos;
            else{
                int nq=++cnt;l[nq]=l[p]+1;
                memcpy(ch[nq],ch[q],sizeof(ch[q]));
                fa[nq]=fa[q];fa[q]=fa[np]=nq;r[nq]=pos;
                for(;p&&ch[p][c]==q;p=fa[p])ch[p][c]=nq;
            }
        }
    }
    Suffix_AutoMaton(){last=cnt=1;}
    void build(int *a,int n){for(int i=1;i<=n;i++)ins(a[i],i);}
    inline int get(int *a,int n){
        int k=1;for(int i=1;i<=n;i++)k=ch[k][a[i]];
        return k;
    }
}sam;
inline char read(){
    char c=getchar();
    while(c<‘a‘||c>‘z‘)c=getchar();
    return c;
}
int main(){
    char c=read();
    while(c>=‘a‘&&c<=‘z‘)a[++l]=c-‘a‘,c=getchar();
    sam.build(a,l);scanf("%d",&n);
    while(n--){
        t=0;char c=read();
        while(c>=‘a‘&&c<=‘z‘)b[++t]=c-‘a‘,c=getchar();
        int s=sam.get(b,t);
        for(int j=sam.r[s]-sam.l[sam.fa[s]];j<=sam.r[s];j++)printf("%c",a[j]+‘a‘);putchar(‘ ‘);
        for(int j=sam.r[s]-sam.l[s]+1;j<=sam.r[s];j++)printf("%c",a[j]+‘a‘);
        nxt[1]=0;
        for(int i=2,j=0;i<=t;i++){
            while(j&&b[i]!=b[j+1])j=nxt[j];
            j+=b[i]==b[j+1];
            nxt[i]=j;
        }
        for(int i=1,j=0;i<=l;++i){
            while(j&&a[i]!=b[j+1])j=nxt[j];
            if(a[i]==b[j+1])++j;
            if(j==t)printf(" %d",i),j=nxt[j];
        }
        puts("");
    }
}
时间: 2024-11-10 07:28:56

【hihocoder】sam1-基本概念的相关文章

几道hihocoder不会做的题

1.https://hihocoder.com/problemset/problem/1433?sid=970287 boarding passes,不会做,看的别人的代码,现在还不是很理解. 2. https://hihocoder.com/problemset/solution/970330 ac自动机,对trie,ac自动机的理解还不是很深刻!这道题目是找每一个字符里面的最长匹配.ac自动机,是对trie加上了失败节点,也就是到当前为止,所能匹配的最长后缀,但是这个最长后缀不一定是keyw

hihocoder 1036 Trie图(AC自动机)

传送门 Description 上回说到,小Hi和小Ho接受到了河蟹先生伟大而光荣的任务:河蟹先生将要给与他们一篇从互联网上收集来的文章,和一本厚厚的河蟹词典,而他们要做的是判断这篇文章中是否存在那些属于河蟹词典中的词语. 当时,小Hi和小Ho的水平还是十分有限,他们只能够想到:“枚举每一个单词,然后枚举文章中可能的起始位置,然后进行匹配,看能否成功.”这样非常朴素的想法,但是这样的算法时间复杂度是相当高的,如果说词典的词语数量为N,每个词语长度为L,文章的长度为M,那么需要进行的计算次数是在N

hihoCoder 1014 Trie树(字典树入门)

题目链接:http://hihocoder.com/problemset/problem/1014(此题附入门讲解) 题面: #1014 : Trie树 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi和小Ho是一对好朋友,出生在信息化社会的他们对编程产生了莫大的兴趣,他们约定好互相帮助,在编程的学习道路上一同前进. 这一天,他们遇到了一本词典,于是小Hi就向小Ho提出了那个经典的问题:"小Ho,你能不能对于每一个我给出的字符串,都在这个词典里面找到以这个字符

WPF 依赖属性概念

理解依赖属性 在 WPF 中变成相比较于 传统 Windows Forms 变成发生了较大的改变. 属性现在以一组服务的形式提供给开发人员. 这组服务就叫做属性系统. 由 WPF 属性系统所支持的属性成为依赖属性. 依赖属性的概念 WPF 在依赖属性中提供了标准属性无法提供的功能, 特性如下: 决定属性值: 依赖属性的属性值可以在运行时有其他元素或者是其他信息所决定, 决定的过程具有一个优先次序. 自动验证或变更通知: 依赖属性哟一个自定的回调方法, 当属性值变更时被执行, 这个回调能验证新的值

Docker的概念及剖析原理和特点

一.docker的简介: 应用容器是个啥样子呢,一个做好的应用容器长的就像一个装好了一组特定应用的虚拟机一样,比如我现在想用mysql数据库,我直接找个装好了的MySQL的容器就可以了,想用的时候一运行容器,MySQL服务就起来了,就可以使用MySQL了 为什么不能直接安装一个MySQL?或者是SqlServer呢也可以啊? 答:因为有的时候根据每个人的电脑的不同,在物理机安装的时候会出现各种各样的错误,突然你的机器中病毒了或者是挂了,你所有的服务都需要重新安装. 注意:    但是有了dock

老男孩教育每日一题-2017年5月11-基础知识点: linux系统中监听端口概念是什么?

1.题目 老男孩教育每日一题-2017年5月11-基础知识点:linux系统中监听端口概念是什么? 2.参考答案 监听端口的概念涉及到网络概念与TCP状态集转化概念,可能比较复杂不便理解,可以按照下图简单进行理解? 将整个服务器操作系统比喻作为一个别墅 服务器上的每一个网卡比作是别墅中每间房间 服务器网卡上配置的IP地址比喻作为房间中每个人 而房间里面人的耳朵就好比是监听的端口 当默认采用监听0.0.0.0地址时,表示房间中的每个人都竖起耳朵等待别墅外面的人呼唤当别墅外面的用户向房间1的人呼喊时

Tensorflow一些常用基本概念与函数(四)

摘要:本系列主要对tf的一些常用概念与方法进行描述.本文主要针对tensorflow的模型训练Training与测试Testing等相关函数进行讲解.为'Tensorflow一些常用基本概念与函数'系列之四. 1.序言 本文所讲的内容主要为以下列表中相关函数.函数training()通过梯度下降法为最小化损失函数增加了相关的优化操作,在训练过程中,先实例化一个优化函数,比如 tf.train.GradientDescentOptimizer,并基于一定的学习率进行梯度优化训练: optimize

Tensorflow一些常用基本概念与函数(三)

摘要:本系列主要对tf的一些常用概念与方法进行描述.本文主要针对tensorflow的数据IO.图的运行等相关函数进行讲解.为'Tensorflow一些常用基本概念与函数'系列之三. 1.序言 本文所讲的内容主要为以下相关函数: 操作组 操作 Data IO (Python functions) TFRecordWrite,rtf_record_iterator Running Graphs Session management,Error classes 2.tf函数 2.1 数据IO {Da

[hihoCoder#1381]Little Y&#39;s Tree

[hihoCoder#1381]Little Y's Tree 试题描述 小Y有一棵n个节点的树,每条边都有正的边权. 小J有q个询问,每次小J会删掉这个树中的k条边,这棵树被分成k+1个连通块.小J想知道每个连通块中最远点对距离的和. 这里的询问是互相独立的,即每次都是在小Y的原树上进行操作. 输入 第一行一个整数n,接下来n-1行每行三个整数u,v,w,其中第i行表示第i条边边权为wi,连接了ui,vi两点. 接下来一行一个整数q,表示有q组询问. 对于每组询问,第一行一个正整数k,接下来一