首页 > 编程语言 >AcWing 算法提高课 AC自动机

AcWing 算法提高课 AC自动机

时间:2022-09-29 17:44:54浏览次数:53  
标签:AC int tr cnt ++ str 自动机 AcWing

AC自动机=Trie+kmp

优化:Trie图

1、kmp

长字符串s和模板串p都以下标1开始。

(1) 求next数组:kmp的next数组存的是p的自匹配,即以p[i]为结尾的后缀能够匹配的最长非平凡(不是自身)前缀。由于非平凡,next[0]=next[1]=0,循环从2开始。

(2)进行匹配,将模板串p在长字符串s上移动,并求出当前可以匹配的最长长度,如果此长度为p的长度,则匹配成功。循环从1开始(可能p长度为1并且直接匹配成功 )

例题:https://www.acwing.com/blog/content/404/

模板:统计模板串在长字符串中出现的个数

int n;
const int N=10010;
const int S=55,M=1000010;

int tr[N*S][26];//自动机数组,第一维节点,第二维子节点
int cnt[N*S];//以当前节点结尾的单词数量
int idx;

char str[M];
int que[N*S];
int ne[N*S];

void Insert()
{
    int p=0;
    for(int i=0;str[i];i++)
    {
        int t=str[i]-'a';
        if(!tr[p][t]) tr[p][t]=++idx;
        p=tr[p][t];
    }
    cnt[p]++;
}

void Build()
{
    int hh=0,tt=-1;
    
    for(int i=0;i<26;i++)
    {
        if(tr[0][i])
            que[++tt]=tr[0][i];
    }
    while(hh<=tt)
    {
        int t=que[hh++];
        for(int i=0;i<26;i++)
        {
            int c=tr[t][i];
            if(!c) continue;
            int j=ne[t];
            while(j&&!tr[j][i]) j=ne[j];
            if(tr[j][i]) j=tr[j][i];
            ne[c]=j;
            que[++tt]=c;
        }
    }
}
void YD()
{
    memset(tr,0,sizeof(tr));
    memset(cnt,0,sizeof(cnt));
    memset(ne,0,sizeof(ne));
    idx=0;
    cin>>n;
    while(n--)
    {
        cin>>(str);
        Insert();//trie插入
    }
    Build();//构建ac自动机
    
    cin>>str;
    int res=0;
    for(int i=0,j=0;str[i];i++)
    {
        int t=str[i]-'a';
        while(j&&!tr[j][t]) j=ne[j];
        if(tr[j][t]) j=tr[j][t];
        //统计答案不光要统计j 还要统计更短的可能出现的单词,即往ne[j]去查询
        
        int p=j;
        while(p)
        {
            res+=cnt[p];
            cnt[p]=0;
            p=ne[p];
        }
        
    }
    cout<<res<<endl;
}
 
View Code

 

标签:AC,int,tr,cnt,++,str,自动机,AcWing
From: https://www.cnblogs.com/ydUESTC/p/16742420.html

相关文章

  • React 使用 State(状态) Hook
    使用State(状态)HookHooks 是一项新功能提案,可让您在不编写类的情况下使用state(状态)和其他React功能。它们目前处于Reactv16.7.0-alpha中,并在 ​​一个开放RFC......
  • React函数组件和类组件的区别
    区别函数组件的性能比类组件的性能要高,因为类组件使用的时候要实例化,而函数组件直接执行函数取返回结果即可。为了提高性能,尽量使用函数组件。区别函数组件类组件是否有 ​......
  • Promise.all、Promise.race、Promise.any
    Pomise.all定义Promise.all()方法接收一个promise的iterable类型(注:Array,Map,Set都属于ES6的iterable类型)的输入,并且只返回一个Promise实例,那个输入的所有promise的resolve回......
  • 定义 stack 和 queue 时可以干的事情
    STLstack,queue内部用deque实现,可以用一些方式规避掉这个问题。stack<int,vector<int>>s;queue<int,list<int>>q;signedmain(){ q.push(1),q.push(2); cout<<q......
  • CF149D Coloring Brackets
    #include<bits/stdc++.h>usingnamespacestd;#defineintlonglongclasssolve{ public: chars[777]; intf[1000][1000][3][3]; intmod; intothers[1000......
  • Anaconda下载安装步骤
    下载地址下载比较慢的,用迅雷下,点击复制地址,然后在迅雷里面直接创建连接​​​Anaconda​​​基于python3.8​​​Anaconda​​基于python3.6的安装步骤没啥说的,一路安装,中间......
  • SOTA,backbone、benchmark和baseline分别是什么意思?
    SOTA全称是stateoftheart,是指在特定任务中目前表现最好的方法或模型。backbone:骨干网络,比如alexnet,ZFnet,VGG,googlenet...benchmark和baseline都是指最基础的比较对象......
  • React+hook+ts+ant design封装一个input和select搜索的组件
    前言我是歌谣我有个兄弟巅峰的时候排名c站总榜19叫前端小歌谣曾经我花了三年的时间创作了他现在我要用五年的时间超越他今天又是接近兄弟的一天人生难免坎坷大不了从......
  • React+hook+ts+ant design封装一个table的组件
    前言我是歌谣我有个兄弟巅峰的时候排名c站总榜19叫前端小歌谣曾经我花了三年的时间创作了他现在我要用五年的时间超越他今天又是接近兄弟的一天人生难免坎坷大不了从......
  • TCP Dup ACK linux kernel 3.2
    ​ TheProblemYourthroughputissuesappeartobecausedbyabuggyimplementationofTCPSequenceNumberrandomization.IhaveseenthisinthepastonCisco......