首页 > 其他分享 >Hetao P3804 Cut 题解 [ 蓝 ] [ AC 自动机 ] [ 差分 ]

Hetao P3804 Cut 题解 [ 蓝 ] [ AC 自动机 ] [ 差分 ]

时间:2025-01-12 19:11:11浏览次数:1  
标签:insert AC Cut int 题解 1000005 ch 自动机

Cut:AC 自动机简单题。

image

image

思路

看见多个模式串以及求前缀,很显然能想到构建一个 AC 自动机。

那么在用 \(T\) 查询时,当前指针的深度就是该位置的最长前缀匹配长度。这个在字典树 insert 的时候就能求出来。

求出每一位的最长前缀后,因为这些部分都不能作为分割点,所以将这些区域用差分区间加,最后求出没有被加过的位置的个数 \(x\),答案即为 \(2^x\)。因为每个分割点可选可不选。

时间复杂度 \(O(n|\sum|)\)。

注意 AC 自动机要 build 后再 query,不然你会和我一样虚空调试 10min。

代码

#include <bits/stdc++.h>
#define fi first
#define se second
#define lc (p<<1)
#define rc ((p<<1)|1)
#define eb(x) emplace_back(x)
#define pb(x) push_back(x)
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef long double ldb;
using pi=pair<int,int>;
const ll mod=998244353;
char t[1000005],s[1000005];
int n,ch[1000005][30],ne[1000005],dep[1000005],idx=0;
ll f[1000005],ans=1;
void insert(char *s)
{
    int p=0;
    for(int i=1;s[i];i++)
    {
        int c=s[i]-'a';
        if(ch[p][c]==0)ch[p][c]=++idx;
        p=ch[p][c];
        dep[p]=i;
    }
}
void build()
{
    queue<int>q;
    for(int i=0;i<26;i++)
    {
        if(ch[0][i])q.push(ch[0][i]);
    }
    while(!q.empty())
    {
        int u=q.front();
        q.pop();
        for(int i=0;i<26;i++)
        {
            int v=ch[u][i];
            if(v)ne[v]=ch[ne[u]][i],q.push(v);
            else ch[u][i]=ch[ne[u]][i];
        }
    }
}
void query(char *s)
{
    int p=0;
    for(int i=1;s[i];i++)
    {
        int c=s[i]-'a';
        p=ch[p][c];
        int len=dep[p];
        if(len)
        {
            f[i]--;
            f[i-len+1]++;
        }
    }
}
int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    cin>>t+1>>n;
    for(int i=1;i<=n;i++)
    {
        cin>>s+1;
        insert(s);
    }
    build();
    query(t);
    int lt=strlen(t+1);
    for(int i=1;i<lt;i++)
    {
        f[i]+=f[i-1];
        if(f[i]==0)ans=(ans*2)%mod;
    }
    cout<<ans;
    return 0;
}

标签:insert,AC,Cut,int,题解,1000005,ch,自动机
From: https://www.cnblogs.com/zhr0102/p/18667176

相关文章

  • 使用RSyslog将Nginx Access Log写入Kafka
    个人博客地址:使用RSyslog将NginxAccessLog写入Kafka|一张假钞的真实世界环境说明CentOSLinuxrelease7.3.1611kafka_2.12-0.10.2.2nginx/1.12.2rsyslog-8.24.0-34.el7.x86_64.rpm创建测试Topic$./kafka-topics.sh--zookeeper192.168.72.25:2181/kafka--create--......
  • 验证出栈顺序是否正确题解&队列
    (1)验证出栈顺序是否正确队列遵循先入后出的原则,故需要一个数组来模拟记录入栈和出栈再分别对出栈顺序进行遍历验证是否正确#include<iostream>usingnamespacestd;#definem100000intb[m],a[m],c[m];intmain(){ intt; cin>>t; while(t--){ intn;......
  • 【论文阅读】Multi-dimensional weighted deep subspace clustering with feature cla
    论文地址:Multi-dimensionalweighteddeepsubspaceclusteringwithfeatureclassification-ScienceDirect摘要基于深度自动编码器(DAE)和自表达层的深度子空间聚类(DSC)方法已经取得了令人瞩目的性能。然而,传统的DSC方法在DAE的特征提取过程中往往会丢失有用信息,导致自表......
  • .git/objects/pack下pack文件很大,但是目前仓库并没有大文件
    git秉承“代码安全为主”,每一次commit都会硬性做备份。之前我使用自己的脚本#!/bin/bash#set-xusage(){echo"Usage:$0[path][lines]"echo"path:localgitrepository"echo"lines:howmuchfilestoshow&remove,default100"echoecho"eg......
  • THUWC 2020 Day3 题解
    Cache一致性协议按照学习手册最后的模拟。\(\text{Exclusive}/\text{Shared}\)只有编号最小的返回,但都要改变状态。\(\text{Modified}\)的所有的都要返回且改变状态。Cache替换算法这里说一下\(\text{PLRU}\)算法。对于每次,先找是否命中。如果是否,就在二叉搜索树上......
  • 2021 年 3 月青少年软编等考 C 语言五级真题解析
    目录T1.红与黑思路分析T2.密室逃脱思路分析T3.求逆序对数思路分析T4.最小新整数思路分析T1.红与黑有一间长方形的房子,地上铺了红色、黑色两种颜色的正方形瓷砖。你站在其中一块黑色的瓷砖上,只能向相邻的黑色瓷砖移动。请写一个程序,计......
  • Codeforces Round 734 (Div. 3) 题解
    建议开题顺序:A,B1,B2,C,E,F,D1,D2。A.PolycarpandCoins记\(k=\min(c1,c2)\),则\((c1-k)\times1+(c2-k)\times2+k\times3=n\)。注意到\(n\mod3\)为\(0,1,2\)。所以我们\(|c1-c2|\)最多为\(1\),只需要将\(n\mod3\)给\(1\)或\(2\)即可。B1.WonderfulColo......
  • 三、字符型(char, character) --- 一个字节的int型
    概念:用来描述字符的数据类型全称:character语法:charch='a';//'a'是字符常量,代表字母achar表示申请的内存空间的大小ch表示申请的内存空间的名称‘a'存储的是字符a的ASCLL码的二进制,01100001(1)、ASCLL表(以ascll码表数值的方式,存储到内存中):(2)、格......
  • 数据结构:栈(Stack)和队列(Queue)—面试题(一)
    目录1、括号匹配2、逆波兰表达式求值 3、栈的压入、弹出序列4、最小栈 1、括号匹配习题链接https://leetcode.cn/problems/valid-parentheses/description/描述:给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。有效字符串需满足:左括号必......
  • 【Flutter&Dart】tolyui_feedback组件例子效果(23 /100)
    上效果图有12种位置展示效果;很能满足大部分需要代码如下:import'package:flutter/material.dart';import'package:tolyui_feedback/tolyui_feedback.dart';classTolyTooltipDemoextendsStatelessWidget{constTolyTooltipDemo({super.key});@override......