首页 > 其他分享 >字符串基础(hash,KMP,AC自动机,trie)

字符串基础(hash,KMP,AC自动机,trie)

时间:2024-05-03 09:03:30浏览次数:20  
标签:AC ch hash trie zc int 自动机

trie树

trie树,又叫字典树,就是把字符串的每个字母看做树上的一个节点,若干个字符串组成了一棵 trie 树。
最一般的trie树好像只能搜索字符串,重点是01trie和可持久化trie树和用trie树来建ac自动机(详见AC自动机)。
这里着重介绍一下01trie
01trie,就是节点代表了数上的二进制位上的数。
可以用来处理位运算。

inline void insert(int x){
    int p=1;
    for(int i=30;i>=0;--i){
        int zc=(x>>i)&1;
        if(!trie[p][zc])trie[p][zc]=++tot;
        p=trie[p][zc];
    }
}//插入的伪代码

P4551 最长异或路径

典题
知道 \(a\otimes b\otimes a=b\)直接处理出来根到每个节点的路径的异或和,关于 \(a\) 节点和 \(b\) 节点之间路径的异或和就是 \(dis_a\otimes dis_b\),枚举每个节点,此时问题已经转化为在 \(n\) 个数中找出与 \(x\) 异或后最大的数。查找的话对于 \(x\) 二进制下每一位贪心取反就行了,直接拿 trie树就做完了。

#include<bits/stdc++.h>
#define endl '\n'
inline int read(){
    char ch=getchar();int x=0,f=1;
    for(;ch<'0'||ch>'9';ch=getchar())if(ch=='-')f=-1;
    for(;ch>='0'&&ch<='9';ch=getchar())x=(x<<1)+(x<<3)+(ch^48);
    return x*f;
}
const int N=2e5+10;
int n,w[N],head[N],v[N],next[N],tot,val[N];
inline void add(int a,int b,int c){v[++tot]=b,w[tot]=c,next[tot]=head[a],head[a]=tot;}
inline void dfs(int x,int fa){
    for(int i=head[x];i;i=next[i]){
        if(v[i]==fa)continue;
        val[v[i]]=val[x]^w[i];
        dfs(v[i],x);
    }
}
int trie[N<<4][2],_p[35];
inline void insert(int x){
    int p=1;
    for(int i=30;i>=0;--i){
        int zc=(x>>i)&1;
        if(!trie[p][zc])trie[p][zc]=++tot;
        p=trie[p][zc];
    }
}
inline int query(int x){
    int p=1,ans=0;
    for(int i=30;i>=0;--i){
        int zc=(x>>i)&1;
        if(trie[p][zc^1])ans+=_p[i],p=trie[p][zc^1];
        else p=trie[p][zc];
    }
    return ans;
}
signed main(){
    // freopen("in.in","r",stdin),freopen("out.out","w",stdout);
    std::ios::sync_with_stdio(false);
    std::cin.tie(0),std::cout.tie(0);
    n=read();_p[0]=1;
    for(int i=1;i<=31;++i)_p[i]=_p[i-1]*2;
    if(n==1){std::cout<<0<<'\n';exit(0);}
    for(int i=1;i<n;++i){
        int u=read(),v=read(),w=read();add(u,v,w);add(v,u,w);
    }
    dfs(1,0);int ans=0;tot=1;
    for(int i=1;i<=n;++i)insert(val[i]);
    for(int i=1;i<=n;++i){
        if(ans<=query(val[i]))ans=query(val[i]);
    }
    std::cout<<ans<<'\n';
}

AC自动机

我们知道 KMP 可以做字符串匹配,但是它是单模式匹配,而 AC 自动机相当于把 KMP 放到了 trie 树上,做到了多模式串匹配。

标签:AC,ch,hash,trie,zc,int,自动机
From: https://www.cnblogs.com/Ishar-zdl/p/18089131

相关文章

  • XSS(Pikachu)
    XSS(Pikachu靶场)概述Cross-SiteScripting简称为“CSS”,为避免与前端叠成样式表的缩写"CSS"冲突,故又称XSS。一般XSS可以分为如下几种常见类型:1.反射性XSS;2.存储型XSS;3.DOM型XSS;XSS漏洞一直被评估为web漏洞中危害较大的漏洞,在OWASPTOP10的排名中一直属于前三的江湖地位......
  • x32dbg 手动脱NsPack 壳
    记一下步骤 文件名字(太长遂改):1111.exe文件来源:攻防世界Reverse三星题,crackme工具选择:下载的文件出现病毒报错,一开始是用OD脱壳,但是修复表的时候,无法运行程序,所以改用x64脱壳方法:ESP 在PE中 在die中发现存在NsPack壳丢到x32dbg中找到程序代码入口 F8到call指令......
  • android Service和activity通信
     在Android中,Service和Activity可以通过多种方式进行通信。以下是一个简单的例子,展示了如何使用Intent、Binder和Interface来实现Service和Activity之间的通信。首先,定义一个Service并创建一个绑定器类(Binder): publicclassMyServiceextendsService{privatefinal......
  • webpack
    vue是基于es6的开发的let是局部变量什么是Webpack本质上,webpack是一个现代JavaScript应用程序的静态模块打包器(modulebundler)。当webpack处理应用程序时,它会递归地构建一个依赖关系图(dependencygraph),其中包含应用程序需要的每个模块,然后将所有这些模块打包成一个或多个b......
  • 使用新版flask-script时报错No module named flask._compat和cannot import name ‘_r
    flask版本:3.0.3Flask-Script:2.0.6Flask-script使用及错误Nomodulenamedflask._compat解决方法windows下推荐解决方案,点击flask_script进入init.py文件或虚拟环境\Lib\site-packages\flask_script_init_.pylinux下cd到目录/usr/local/lib/python3.12/site-packages......
  • acwing351
    https://www.acwing.com/activity/content/problem/content/9051/NOIP2007提高组T4。本题是加强版。题目描述设\(T=(V,E,W)\)是一个无圈且连通的无向图(也称为无根树),每条边带有正整数的权,我们称\(T\)为树网(treenetwork),其中\(V,E\)分别表示结点与边的集合,\(W\)表示各边......
  • SystemVerilog -- 2.6 Data Types ~ SystemVerilog Unpacked Arrays
    SystemVerilogUnpackedArraysUnpackedArrays用于引用在变量名称之后声明的维度。UnpackedArrays可以是固定大小的数组、动态数组、关联数组、队列。SingleDimensionalUnpackedArraymoduletb;bytestack[8];//depth=8,1bytewidevariableinitial......
  • csrf-基于Pikachu的学习
    CSRF-跨站请求伪造CSRF的原理CSRF攻击即Cross-siterequestforgery,跨站请求伪造,直白来说就是恶意网站伪装成用户,向被害网站发起操作请求。用户输入账号信息请求登录A网站。A网站验证用户信息,通过验证后返回给用户一个cookie在未退出网站A之前,在同一浏览器中请求了黑客构造......
  • SystemVerilog -- 2.5 Data Types ~ SystemVerilog Packed Arrays
    SystemVerilogPackedArraysSystemVerilog中有两种类型的数组-packedarray和unpackedarray。packedarray用于引用在变量名称之前声明的维度。bit[3:0]data;//Packedarrayorvectorlogicqueue[9:0];//unpackedarraypackedarray保证表示为一组......
  • windows密码存储以及hashdump所得信息解析
    1.windows登录的明文密码,存储过程是怎么样的,密文存在哪个文件下,该文件是否可以打开,并且查看到密文在Windows中密码通常不会以明文形式存储。系统会通过保存密码的哈希值来确保安全性。这个过程涉及到NTLM或Kerberos身份认证协议,它们负责加密存储密码。以下是存储过程的简要说......