Noip前的大抱佛脚----字符串

Posted xzyxzy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Noip前的大抱佛脚----字符串相关的知识,希望对你有一定的参考价值。

字符串

知识点

AC自动机

把多个串插入一个自动机里进行匹配,其实建好的是Trie图

void Add(char *s,int op)
{
    int x=0,len=strlen(s+1);
    for(int i=1;i<=len;i++)
    {
        int &v=ch[x][s[i]-'a'];
        if(!v) v=++node;x=v;
    }
    tag[x]+=op;
}
void Get_Trie()
{
    for(int i=0;i<=1;i++) if(ch[0][i]) Q.push(ch[0][i]);
    while(!Q.empty())
    {
        int x=Q.front();Q.pop();
        for(int i=0;i<=1;i++)
            if(!ch[x][i]) ch[x][i]=ch[fail[x]][i];
            else fail[ch[x][i]]=ch[fail[x]][i],Q.push(ch[x][i]);
    }
}

套路

用FFT求解字符串匹配问题

  • 一一对应

把其中一个(Reverse)后,对于每个字符跑一遍FFT,打上(Tag)

如果在某个位置上有串长个(Tag)那便是匹配上了一处

  • 模糊匹配

(Fuzzy Search) 在跑(FFT)前把模糊门限值的区间内全部置为1,然后同样的操作

两(多)串DP时状态合并

插入AC自动机,老套路了

Trie树上贪心

通常求解一堆数和A进行异或、与等操作的最大值,直接贪心即可

但是求(x+B)^A的最大值呢(SCOI2016美味)(当然&操作也是一样的,这种题通常值域很小)

同样贪心地做

开值域线段树,贪心到某一位,需要该位为0或者1,则对应地可以算出x的范围,查询是否有在这个范围之内的x即可

挂链哈希

期望(O(1)),当然支持查询多个关键字

const int Mo=YYB;
struct HashTable
{
    struct Line{int next,val;}a[Mo];
    int head[Mo],cnt;
    void reset() {memset(head,0,sizeof(head));cnt=0;}
    void Add(int p,int val) {a[++cnt]=(Line){head[p],val};head[p]=cnt;}
    int Query(int x)
        {
            for(int i=head[x%Mo];i;i=a[i].next)
                if(a[i].val==x) return 1;return 0;
        }
}Hash;

哈希处理回文串

正反哈希前缀和即可求出区间哈希值,然后查询起点到回文中心的正哈希和回文中心到终点的反哈希即可

树哈希

例:一棵无根树的本质不同的独立集个数((k)棵相同子树方案为(x)则乘一个可重组合)

以上是关于Noip前的大抱佛脚----字符串的主要内容,如果未能解决你的问题,请参考以下文章

Noip前的大抱佛脚----数论

Noip前的大抱佛脚----图论

Noip前的大抱佛脚----奇技淫巧

Noip前的大抱佛脚----根号对数算法

Noip前的大抱佛脚----一些思路

Noip前的大抱佛脚----数据结构