Searching the String 【ZOJ - 3228】【AC自动机+last跳板优化时间】

2023-10-30

题目链接


  这次要求的有两个,分别是0、1,代表着的是可以重叠,以及不可以重叠的遍历到该单词的次数,可以重叠的很容易,遇到的时候,就直接加上就是了,但是不可以重叠的时候呢,就需要看到该单词它和上一次的状态出现的距离差了,看一下是否比这个单词长即可。

  然后我看了一下这个,就想到需要不断的向前fail,但是由于可能fail的无效次数太多,所以就用了last跳板,但是最后发现只优化了100+ms,区别不是太大。


#include <iostream>
#include <cstdio>
#include <cmath>
#include <string>
#include <cstring>
#include <algorithm>
#include <limits>
#include <vector>
#include <stack>
#include <queue>
#include <set>
#include <map>
#define lowbit(x) ( x&(-x) )
#define pi 3.141592653589793
#define e 2.718281828459045
#define INF 0x3f3f3f3f
#define HalF (l + r)>>1
#define lsn rt<<1
#define rsn rt<<1|1
#define Lson lsn, l, mid
#define Rson rsn, mid+1, r
#define QL Lson, ql, qr
#define QR Rson, ql, qr
#define myself rt, l, r
#define MP(a, b) make_pair(a, b)
using namespace std;
typedef unsigned long long ull;
typedef long long ll;
const int maxN = 1e5 + 7;
struct node
{
    int nex[26], fail, las, pos, id;
    void clear() { memset(nex, 0, sizeof(nex)); fail = id = pos = las = 0; }
}a[maxN<<3];
int tot, N, op[maxN], head[maxN], cnt;
char A[maxN], virus[10];
void insert(int ti)
{
    int len = (int)strlen(virus), temp = 0, _id;
    for(int i=0; i<len; i++)
    {
        _id = virus[i] - 'a';
        if(!a[temp].nex[_id])
        {
            a[++tot].clear();
            a[temp].nex[_id] = tot;
        }
        temp = a[temp].nex[_id];
    }
    a[temp].pos = len;
    if(!a[temp].id) a[temp].id = ++cnt;
    head[ti] = a[temp].id;
}
inline void build_fail()
{
    queue<int> Q;   Q.push(0);
    int tmp, son, p;
    while(!Q.empty())
    {
        tmp = Q.front();    Q.pop();
        for(int i=0; i<26; i++)
        {
            son = a[tmp].nex[i];
            if(son)
            {
                if(!tmp) a[son].fail = a[son].las = 0;
                else
                {
                    p = a[tmp].fail;
                    while(p && !a[p].nex[i]) p = a[p].fail;
                    a[son].fail = a[p].nex[i];
                    if(a[a[son].fail].id) a[son].las = a[son].fail;
                    else a[son].las = a[a[son].fail].las;
                }
                Q.push(son);
            }
        }
    }
}
int last[maxN], ans0[maxN], ans1[maxN]; //上一次出现的位置
inline void AC_auto()
{
    memset(last, -1, sizeof(last));
    int tmp = 0, len = (int)strlen(A), _id, p;
    for(int i=0; i<len; i++)
    {
        _id = A[i] - 'a';
        while(tmp && !a[tmp].nex[_id]) tmp = a[tmp].fail;
        tmp = a[tmp].nex[_id];
        if(!tmp) continue;
        p = tmp;
        while(p)
        {
            if(a[p].pos)
            {
                ans0[a[p].id]++;
                if(i - last[a[p].id] >= a[p].pos) { ans1[a[p].id]++; last[a[p].id] = i; }
            }
            p = a[p].las;
        }
    }
}
inline void init()
{
    tot = cnt = 0;
    a[0].clear();
    memset(ans0, 0, sizeof(ans0));
    memset(ans1, 0, sizeof(ans1));
}
int main()
{
    int Cas = 0;
    while(scanf("%s", A)!=EOF)
    {
        scanf("%d", &N);
        init();
        for(int i=1; i<=N; i++) { scanf("%d%s", &op[i], virus); insert(i); }
        printf("Case %d\n", ++Cas);
        build_fail();
        AC_auto();
        for(int i=1; i<=N; i++)
        {
            if(op[i]) printf("%d\n", ans1[head[i]]);
            else printf("%d\n", ans0[head[i]]);
        }
        printf("\n");
    }
    return 0;
}

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Searching the String 【ZOJ - 3228】【AC自动机+last跳板优化时间】 的相关文章

随机推荐

  • js vue 使用 map和computed巧妙设计可选列表和已选列表的联动

    需求说明 当已选列表中存在了可选列表的选项 则在可选列表中做出标记 使用map和computed的巧妙写法 otherFiledList是已选数据 fieldList是可选数据 已选数据是可选数据构成的 div i class el ico
  • 16. Dubbo原理解析-集群&容错之router路由服务

    Router服务路由 根据路由规则从多个Invoker中选出一个子集AbstractDirectory是所有目录服务实现的上层抽象 它在list列举出所有invokers后 会在通过Router服务进行路由过滤 Router接口定义 pub
  • 2016——大数据版图

    编者注 原文是 FirstMark Capital 的 Matt Turck 的文章 本文全面总结了大数据领域的发展态势 分析认为尽管大数据作为一个术语似乎已经过气 但是大数据分析与应用才刚刚开始兴起 在与 AI 人工智能等新兴技术的结合下
  • JSON格式转MAP的6种方法

    JSON字符串自动转换 Created by zkn on 2016 8 22 public class JsonToMapTest01 public static void main String args String str 0 zh
  • MySQL中的各种自增ID

    微信搜索 coder home 或扫一扫下面的二维码 关注公众号 第一时间了解更多干货分享 还有各类视频教程资源 扫描它 带走我 文章目录 背景 自增ID的数据类型 单位换算规则 自增ID取值范围 无符号位的计算方式 有符号位的计算方式 i
  • JDialog弹窗

    JDialog弹窗 package com chen lesson4 import javax swing import java awt import java awt event ActionEvent import java awt
  • python后端学习(二)TCP客户端和服务端

    TCP简介 TCP协议 传输控制协议 英语 Transmission Control Protocol 缩写为 TCP 是一种面向连接的 可靠的 基于字节流的传输层通信协议 由IETF的RFC 793定义 TCP通信需要经过创建连接 数据传
  • 14 【接口规范和业务分层】

    14 接口规范和业务分层 1 接口规范 RESTful架构 1 1 什么是REST REST全称是Representational State Transfer 中文意思是表述 编者注 通常译为表征 性状态转移 它首次出现在2000年Roy
  • android EditText 实时监听输入框的内容

    在开发中很多时候我们都会用到EditText 对输入内容的实时监听也是不可或缺的 在android中为我们提供了TextWatcher这个类 我们只要extends这个类然后etColler addTextChangedListener e
  • C#基础知识框架整理

    目录 NET FrameWork框架 NET平台 类库 快速启动vs sln文件的使用 在解决方案里 csprog文件的使用 在项目文件夹里 排除语法错误 设置行号 设置字体 恢复出厂设置 自动切换运行的项目 C 的3种注释符 C 常用的快
  • 浙大计算机学院博士毕业论文要求,浙大在读博士需要3篇SCI 论文才能毕业,清华博士却不作要求!...

    原标题 浙大在读博士需要3篇SCI 论文才能毕业 清华博士却不作要求 最近 又进入了一年的秋招季 很多学子纷纷加入求职大军之中 但是今年却有不一样的声音 有在读研究生表示 学校对毕业要求提高 要在专业期刊发表论文 这成了比找工作更让人烦心的
  • Java整合七牛云进行文件的上传与下载

    一 七牛云的对象存储的介绍 七牛云对象存储 Kodo 是七牛云提供的高可靠 强安全 低成本 可扩展的存储服务 您可通过控制台 API SDK 等方式简单快速地接入七牛存储服务 实现海量数据的存储和管理 通过 Kodo 可以进行文件的上传 下
  • Filter与Listener

    目录 Filter 1 Filter概念 2 Filter快速入门 3 Filter细节 1 web xml配置 2 Filter执行流程 3 Filter生命周期方法 4 Filter配置详解 拦截路径配置 拦截方式配置 1 注解配置 2
  • micropython下载及安装编译过程

    本文根据 参考文献 实现基于Black F407VE开发板的micropython移植 为后期 stm32H743的 micropython作准备 参考 http docs micropython org en latest 1 下载mic
  • k8s 实战之路

    k8s就是kubernetes 关于k8s 基本属于运维的范畴 一般除了一线大厂会有自研的运维平台和运维团队去做这些事 其他的中小型公司都会要求自己的研发人员懂这些运维的东西 还有nginx等 k8s 刚接触 目前还没有在现实工作中实际操作
  • java 继承 异常_Java异常以及继承的一些问题

    Java异常以及继承的一些问题 类之间的关系 java异常类层次结构图 Throwable Throwable是 Java 语言中所有错误或异常的超类 Throwable包含两个子类 Error 和 Exception 它们通常用于指示发生
  • 【vue】el-upload 图片上传的封装

  • Android DataBinding的基本使用

    5 DataBinding https developer android com topic libraries data binding custom conversions 数据绑定库是一种支持库 借助该库 您可以使用声明性格式 而非
  • 基于pytorch的LSTM进行字符级文本生成实战

    基于pytorch的LSTM进行字符级文本生成实战 文章目录 基于pytorch的LSTM进行字符级文本生成实战 前言 一 数据集 二 代码实现 1 导入库及LSTM模型构建 2 数据预处理函数 3 训练函数 4 预测函数 5 文本生成函数
  • Searching the String 【ZOJ - 3228】【AC自动机+last跳板优化时间】

    题目链接 这次要求的有两个 分别是0 1 代表着的是可以重叠 以及不可以重叠的遍历到该单词的次数 可以重叠的很容易 遇到的时候 就直接加上就是了 但是不可以重叠的时候呢 就需要看到该单词它和上一次的状态出现的距离差了 看一下是否比这个单词长