洛谷p4180 ac自动机

2023-05-16

匹配字符串时,对于重复的单词我们只考虑一次,我们开一个数组记录,重复单词的第一个id将重复单词的出现次数全部变为第一次出现的个数相加。且在匹配时,对于每个now只扫描一次,不重复扫描。

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <queue>
#include <cstring>
#include <algorithm>
#include <string>
using namespace std;
//由于题目中子串美丽度计算时不可重复,因此记录每个字符串长度,

struct Tire{
    int nxt[1000100][26],fail[1000100],ed[1000100],sum[1000100],same[1000100];
    int cnt,rt;
    int ans[1000100],vis[1000100];
    int newnode()
    {
        for(int i=0;i<26;i++)
        {
            nxt[cnt][i]=-1;
        }
        ed[cnt++]=0;
        return cnt-1;
    }
    void init()
    {
        cnt=0;
        rt=newnode();
    }
    void ins(string s,int id)
    {
        int len=s.size();
        int now=rt;
        for(int i=0;i<len;i++)
        {
            if(nxt[now][s[i]-'a']==-1)
            {
                nxt[now][s[i]-'a']=newnode();
            }
            now=nxt[now][s[i]-'a'];
            sum[now]++;
        }
        if(ed[now])
        same[id]=ed[now];
        else
        same[id]=ed[now]=id;

    }
    void build()
    {
        queue<int>q;
        fail[rt]=rt;
        for(int i=0;i<26;i++)
        {
            if(nxt[rt][i]==-1)
            {
                nxt[rt][i]=rt;
            }
            else
            {
                fail[nxt[rt][i]]=rt;
                q.push(nxt[rt][i]);
            }
        }
        while(!q.empty())
        {
            int now=q.front();
            q.pop();
            for(int i=0;i<26;i++)
            {
                if(nxt[now][i]==-1)
                {
                    nxt[now][i]=nxt[fail[now]][i];
                }
                else
                {
                    fail[nxt[now][i]]=nxt[fail[now]][i];
                    q.push(nxt[now][i]);
                }
            }
        }
    }
    void query(string s)
    {
        int now=rt,top=0;
       for(int i=0;i<s.size();i++)
       {
          now=nxt[now][s[i]-'a'];
          int tt=now;
          while(tt)
          {
              if(ed[tt]&&!vis[now])
              {
              ans[ed[tt]]+=sum[now];
              //printf("%d %d\n",ed[tt],ans[ed[tt]]);
              }tt=fail[tt];
          }
          vis[now]=1;
       }
    }
};
Tire ac;
string s[300];
int main()
{
        int n;
        scanf("%d",&n);
        ac.init();
        for(int i=1;i<=n;i++)
        {
             cin>>s[i];
             ac.ins(s[i],i);
        }
        ac.build();
        for(int i=1;i<=n;i++)
            if(ac.same[i]==i)
            ac.query(s[i]);
        for(int i=1;i<=n;i++)
        {
            printf("%d\n",ac.ans[ac.same[i]]);
        }
    return 0;
}

 

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

洛谷p4180 ac自动机 的相关文章

随机推荐

  • VS2019 + CUDA11.0开发环境配置

    VS2019 43 CUDA11 0开发环境配置 确认系统是否支持安装VS2019安装CUDA11 0实例程序 确认系统是否支持 确认自己的设备是否支持CUDA11 0 打开NVIDIA控制面板 xff0c 一般N卡的设备都在鼠标右键就有
  • 排序算法:选择排序

    1 什么是选择排序 xff1f xff08 摘抄自百度百科 xff09 选择排序 xff08 Selection sort xff09 是一种简单直观的排序算法 它的工作原理是 xff1a 第一次从待排序的数据元素中选出最小 xff08 或
  • markdown-it 介绍,以及使用,自定义规则

    markdown it markdown it 是前端的一个 markdown 解析库 xff0c 将 markdown 解析成 Token 流 网上都有很多详细的 token 流解析过程 xff0c 请先简单看一遍 markdown it
  • apt-get update 报错

    sudo apt get update 报错 E 无法解析软件包文件 var lib apt lists ppa launchpad net rabbitvcs ppa ubuntu dists xenial main i18n Trans
  • Tiny210裸机开发初体验

    从昨天开始搞了一下Tiny210的裸机 xff0c 长时间没玩有点生疏了 由于开发板光盘自带裸机程序例程 xff0c 所以先跑一下简单的点灯 xff0c 打通调试通路然后再进行学习 首先使用了方法1 xff1a 参考国嵌视频烧录superb
  • System Verilog——C语言调用SV对象中的方法

    本文接上一篇文章 xff0c 即调用System Verilog 任务的C 任务 xff0c 简介如下 https blog csdn net qq 31348733 article details 101000399 如何在C语言中调用S
  • 程序设计思维与实践 Week15 作业

    ZJM 与纸条 ZJM 的女朋友是一个书法家 xff0c 喜欢写一些好看的英文书法 有一天 ZJM 拿到了她写的纸条 xff0c 纸条上的字暗示了 ZJM 的女朋友 想给 ZJM 送生日礼物 ZJM 想知道自己收到的礼物是不是就是她送的 x
  • 利用Python的scrapy框架爬取手游排行前几名的手游信息

    初学scrapy框架 Scrapy是一个为了爬取网站数据 xff0c 提取结构性数据而编写的应用框架 可以应用在包括数据挖掘 xff0c 信息处理或存储历史数据等一系列的程序中 有关于scrapy的教学与基础知识这里不做解释 xff0c 感
  • 【ORB-SLAM3】CMake Error at CMakeLists.txt:37 (message): OpenCV > 2.4.3 not found.

    项目场景 xff1a ZED2相机配置使用ORB SLAM3 ZED2相机配置使用ORB SLAM3 xff0c 出现关于opencv的报错 问题描述 CMake Error at CMakeLists txt 37 message Ope
  • 领航-跟随型编队 (六)避障问题综述

    领航 跟随型编队避障问题指编队在运动过程中 xff0c 领航机器人根据某种方式获取与识别前方障碍物 xff0c 同时编队整体采取一定方法及时规避障碍物与防止内部碰撞 xff0c 涉及到障碍物检测 编队避障规划 编队避碰协调 xff0c 运动
  • 领航跟随型编队(十)编队实验视频

    实验一 xff1a 圆形轨迹下编队生成与保持实验 如图 5 19 所示 xff0c 两个机器人完成从随机状态形成编队并沿圆形轨迹保持编队运行 xff0c 且图中下方的窗口动态显示编队的运行情况 领航机器人初始信息 xff1a 坐标 0 5m
  • 内网项目中引入NoVnc服务

    内网项目中引入NoVnc服务 背景目标方案部署步骤完成后验证效果 背景 目前项目中 xff0c 管理的实例底层为虚拟机 xff0c 而在用户或运维人员管理具体的实例时 xff0c 需另外启动VNC Viewer客户端才能配置实例 xff0c
  • Jupyter最全指南及常见问题(持续更新)

    anaconda与jupyter lab搭配使用 jupyter lab是jupyter notebook升级版 非常好用 命令行安装 xff1a pip install jupyterlab即可 安装好了之后 xff0c 命令行输入 ju
  • 头文件

    include lt iostream gt include lt algorithm gt include lt cassert gt include lt string gt include lt sstream gt include
  • MySQL 8.0 密码重置

    MySQL 版本 8 0 系统 xff1a Linux 原因 xff1a 数据库无法登录 xff08 非忘记密码 xff09 xff0c 登上后发现竟然数据库被黑了 xff0c 留了一条 BTC 的 赎回记录 首先关闭现有的mysql 服务
  • MySQL 取出每个分组中最新的一条数据(ID最大)

    场景 xff1a 由于一个摄像头管理一个范围 xff0c 且管理的某个人可以多次犯规 故 xff0c 一个摄像头可以上报有多个事件 xff0c 多个事件可能同时上报 xff0c 可能有先后顺序 需求 xff1a 现地图只显示有事件摄像头的最
  • java获取天气接口

    如下图 span class token keyword package span span class token namespace com span class token punctuation span octv span cla
  • Eclipse反编译插件(免费无需下载资源)

    分享一个适用eclipse的java反编译插件JD Decompiler 最近eclipse插件库被玩坏了 xff0c 于是重新安装插件 xff0c 站内搜索发现反编译插件竟然都要积分下载了 以下是插件官网 xff0c 看不懂英文的小伙伴用
  • JAVA基础疑难——001Boolean类型传值问题

    今天在帮助一位小伙伴解决传值的问题的时候 xff0c 发现他使用的是boolean类型的带参方法 程序执行没有问题 xff0c 但是boolen类型的值传不出来 怎么找问题都找不出来 今天就该问题所产生的原因给大家分享一下 xff0c 下面
  • 洛谷p4180 ac自动机

    匹配字符串时 xff0c 对于重复的单词我们只考虑一次 xff0c 我们开一个数组记录 xff0c 重复单词的第一个id将重复单词的出现次数全部变为第一次出现的个数相加 且在匹配时 xff0c 对于每个now只扫描一次 xff0c 不重复扫