给出长度为m的文本

查询 n个单词出现的次数

用kmp 复杂度 n*m*(单词平均长度)

用字典树 复杂度 m*每次字典树遍历的平均深度)

AC自动机  复杂度 m  (思路可以理解为kmp+字典树 )

正在学  代码没修改完

#include<bits/stdc++.h>
using namespace std;
;
;
struct node
{
    node *fail;
    node *next[kind];
    int cnt;
    node()
    {
        fail=NULL;
        cnt=;
        memset(next,NULL,sizeof(next));
    }
}*q[maxn];
];
]; //模式串
int head,tail;    //队列的头尾指针
void insert(char *str,node *root)  // **************建树
{
    node *p=root;
    ,index;
    while(str[i])
    {
        index=str[i]-'a';
        if(p->next[index]==NULL) p->next[index]=new node();
        p=p->next[index];
        i++;
    }p->cnt++;
}
void build_ac_automation(node *root)
{
    root->fail=NULL;
    q[head++]=root;//  tou zhi zheng
    while(head!=tail)
    {
        node *temp=q[tail++];
        node *p=NULL;
        ;i<;i++)
        {
            if(temp->next[i]!=NULL)
            {
                if(temp==root) temp->next[i]->fail=root;
                else
                {
                    p=temp->fail;
                    while(p!=NULL)
                    {
                        if(p->next[i]!=NULL)
                        {
                            temp->next[i]->fail=p->next[i];
                            break;
                        }
                        p=p->fail;
                    }
                    if(p==NULL) temp->next[i]->fail=root;
                }
                q[head++]=temp->next[i];
            }
        }
    }
}
int ac_query(node *root)
{
    ;
    ;
    int index;
    int l=strlen(str);
    node *p=root;
    while(str[i])
    {
        index=str[i]-'a';
        index=str[i]-'a';
        while(p->next[index]==NULL && p!=root) p=p->fail;
        p=p->next[index];
        p=(p==NULL)?root:p;
        node *temp=p;
        )
        {
            num+=temp->cnt;
            temp->cnt=-;
            temp=temp->fail;
        }
        i++;
    }
    return num;
}
int32_t main()
{

}

banzi   https://www.cnblogs.com/MingSD/p/8733762.html

#include<bits/stdc++.h>
using namespace std;
#define LL long long
#define ULL unsigned LL
#define fi first
#define se second
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define max3(a,b,c) max(a,max(b,c))
#define min3(a,b,c) min(a,min(b,c))
const int INF = 0x3f3f3f3f;
;
typedef pair<int,int> pll;
, M = 1e3;
];
][];
];
];
;
void Insert(){
    , len = strlen(str);
    ; i < len; i++){
        int id = str[i] - 'a';
        ){
            cnt[tot] = ;
            fair[tot] = ;
            trie[rt][id] = tot++;
        }
        rt = trie[rt][id];
    }
    cnt[rt]++;
}
void Build_tree(){
    queue<int> q;
    q.push();
    int p;
    while(!q.empty()){
        int tmp = q.front();
        q.pop();
        ; i < ; i++){
            ){
                )
                    fair[trie[tmp][i]] = ;
                else{
                    p = fair[tmp];
                    while(p){
                        if(trie[p][i]){
                            fair[trie[tmp][i]] = trie[p][i];
                            break;
                        }
                        else p = fair[p];
                    }
                    ;
                }
                q.push(trie[tmp][i]);
            }
        }
    }
}
int Query(){
    , ret = , len = strlen(str);
    ; i < len; i++){
        int id = str[i] - 'a';
        ) rt = fair[rt];
        rt = trie[rt][id];
        ) rt = ;
        int tmp = rt;
        ){
            ){
                ret += cnt[tmp];
                cnt[tmp] = -;
            }
            else break;
            tmp = fair[tmp];
        }
    }
    return ret;
}
void init(){
    ; i < tot; i++){
        ; j < ; j++)
            trie[i][j] = ;
    }
    tot = ;
}
int main(){
    int T;
    scanf("%d", &T);
    while(T--)
    {
        init();
        int n;
        scanf("%d", &n);
        while(n--)
        {
            scanf("%s", str);
            Insert();
        }
        Build_tree();
        scanf("%s", str);
        printf("%d\n", Query());
    }
    ;
}

AC自动机自我理解和模板的更多相关文章

  1. AC自动机详解 (P3808 模板)

    AC自动机笔记 0.0 前言 哇,好久之前就看了 KMP 和 Trie 树,但是似乎一直没看懂 AC自动机?? 今天灵光一闪,加上之前看到一些博客和视频,瞬间秒懂啊... 其实这个玩意还是蛮好理解的. ...

  2. HDOJ-2222(AC自动机+求有多少个模板串出现在文本串中)

    Keywords Search HDOJ-2222 本文是AC自动机的模板题,主要是利用自动机求有多少个模板出现在文本串中 由于有多组输入,所以每组开始的时候需要正确的初始化,为了不出错 由于题目的要 ...

  3. KMP算法自我理解 和 模板

    字符串   abcd abc abcd abc 匹配串   cdabcd 匹配串的 next  0 0 0 0 1 2: 开始匹配 abcd abc abcd abc cd abc d a,d 匹配失 ...

  4. 【AC自动机】HDU中模板题

    [HDU2222] 最纯粹的裸题,错误点详见注释. #include<iostream> #include<cstdio> #include<cstring> #i ...

  5. ac自动机(tree+kmp模板)

    Keywords Search Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others ...

  6. HDU 2222 AC自动机模板题

    题目: http://acm.hdu.edu.cn/showproblem.php?pid=2222 AC自动机模板题 我现在对AC自动机的理解还一般,就贴一下我参考学习的两篇博客的链接: http: ...

  7. 【题解】P3796【模板】AC自动机(加强版)

    [题解]P3796 [模板]AC自动机(加强版) 记录当前\(cnt\)是第几个"星".记录第几个串是对应着第几个星. 这里补充一点对于\(AC\)自动机的理解.可能一直有个问题我 ...

  8. AC自动机--summer-work之我连模板题都做不出

    这章对现在的我来说有点难,要是不写点东西,三天后怕是就一无所有了. 但写这个没有营养的blog的目的真的不是做题或提升,只是学习学习代码和理解一些概念. 现在对AC自动机的理解还十分浅薄,这里先贴上目 ...

  9. 洛谷--P3808 【模板】AC自动机(“假的“简单版)

    如果你想要做出这道题,你需要先了解两个知识点: 1.字典树的构造 2.KMP算法(也就是fail指针的构造) 对于字典树,可以看看这个大佬: https://www.cnblogs.com/TheRo ...

随机推荐

  1. 适应c++ 新特性 - 与我 - 多年传统方式开发(新特性参考微软标准:https://msdn.microsoft.com/zh-cn/library/hh279654.aspx)

    公司同事都在积极使用c++的新特性,并对其赞不绝口,而自己一直做着传统的c++开发方式,到底这些新特性如何,又是怎么提高开发效率的,我依然在疑问当中,从同事的说法和实际代码操练里,确实在减少代码量,集 ...

  2. POJ 3126 Prime Path bfs, 水题 难度:0

    题目 http://poj.org/problem?id=3126 题意 多组数据,每组数据有一个起点四位数s, 要变为终点四位数e, 此处s和e都是大于1000的质数,现在要找一个最短的路径把s变为 ...

  3. 使用ADO.NET访问、查询和操作数据库

    ADO.ENT的主要组件 提供两个组件,用来访问和处理数据:.NET Framework 数据程序和DataSet(数据集) .NET Framework:是专门为数据处理及快速地只进,只读访问数据而 ...

  4. 【阅读笔记】《C程序员 从校园到职场》第三章 程序的样式(大括号)

    参考: https://blog.csdn.net/zhouzhaoxiong1227/article/details/22820533 一..初始化数组变量 在实际的软件开发项目中,变量在使用前应初 ...

  5. flask项目结构(二)创建flask,同步docker

    简介: 建立flask容易,那么部署就比较麻烦了,配这个,配那个,更新………… 所以我从构建,就考虑部署的问题,使用docker部署. 程序都打包进docker,本博客有相关文章. pycharn直接 ...

  6. 谷歌浏览器慎用有道词典插件(<audio></audio>) (转载)

    谷歌浏览器慎用有道词典插件(<audio></audio>)  原文 :http://blog.csdn.net/u010556394/article/details/7112 ...

  7. mongoose的笔记

    本文地址转载自:http://www.cnblogs.com/egger/archive/2013/06/14/3135847.html  本文将介绍操作符的使用,配合操作符,我们可以执行更加复杂的操 ...

  8. 理解AXI Quad Serial Peripheral Interface(SPI) IP核

    reference :   PG153-AXI Quad SPI v3.2 LogiCORE IP Product Guide.pdf 在使用MicroBlaze过程中,调用了此IP,所以有必须仔细学 ...

  9. 利用SMB jcifs实现对windows中的共享文件夹的操作

    需求是在本地上传文件到服务器上,服务器是windows的,使用共享文件夹提供权限给你的. 利用第三方: CIFS (Common Internet File System) SMB(Server Me ...

  10. tensorflow-可视化

    先学习几个英文单词 summary 汇总,摘要 scope 范围 我这是很早以前的笔记,后来有了博客才发布的,有些内容比较老,懒得改了.  先说明总体流程 暂时不管怎么编程,假设已经有了如下代码,可执 ...