首页 > 其他分享 >KMP自动机例题(待学习)

KMP自动机例题(待学习)

时间:2022-08-30 20:46:34浏览次数:42  
标签:自动机 int auto KMP ++ str kmp 例题

KMP自动机可以在O(1)的时间内计算kmp。

KMP自动机数组kmp_auto[i][j]可以表示第i位为'a'+j时的最长前缀长度(此前缀可以包含自身)。

kmp[i]数组,表示第i位的最长前缀长度(不含自身)

可以有kmp[i]=kmp_auto[kmp[i-1]][str[i]-'a'];

例题:

https://codeforces.com/contest/1721/problem/E

题解:

https://www.bilibili.com/video/BV1Zd4y137qa?spm_id_from=333.1007.top_right_bar_window_history.content.click&vd_source=75ae018f8d1181302d7ea76b60c928f4

代码:

官方:https://codeforces.com/blog/entry/106416

#include<bits/stdc++.h>

using namespace std;
typedef long long LL;
typedef pair<int, int> PII;
typedef pair<long long, long long> PLL;

int kmp[1000020];
int kmp_auto[1000020][26];
void KMP(string& str)
{
    int n = str.size();
    kmp[0] = 0;
    for (int i = 1; i < n; i++)
    {
        int j = kmp[i - 1];
        while (j > 0 && str[i] != str[j])
            j = kmp[j - 1];
        if (str[i] == str[j]) j++;
        kmp[i] = j;
    }

}
void YD()
{
    string str; cin >> str;
    KMP(str);
    int n = str.size();
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < 26; j++)
        {
            if (i > 0 && j != str[i] - 'a')
                kmp_auto[i][j] = kmp_auto[kmp[i - 1]][j];
            else
                kmp_auto[i][j] = i + (j == str[i] - 'a');
        }
    }
    int q; cin >> q;
    vector<vector<int>> ans(q);
    while (q--)
    {
        string t; cin >> t;
        int m = t.size();
        str += t;
        for (int i = n; i < m + n; i++)
        {
            for (int j = 0; j < 26; j++)
            {
                if (j != str[i] - 'a')
                    kmp_auto[i][j] = kmp_auto[kmp[i - 1]][j];
                else
                    kmp_auto[i][j] = i + 1;
            }
            kmp[i] = kmp_auto[kmp[i-1]][str[i]-'a'];
            ans[q].push_back(kmp[i]);
        }
        while (m--) str.pop_back();
    }
    q=ans.size();
    for (int i = q - 1; i >= 0; i--)
    {
        for (auto res : ans[i])
        {
            cout << res << ' ';
        }
        cout << endl;
    }
}

int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);
    int T = 1;
    //cin >> T;
    while (T--)
    {
        YD();
    }
    return 0;
}
View Code

 

标签:自动机,int,auto,KMP,++,str,kmp,例题
From: https://www.cnblogs.com/ydUESTC/p/16640733.html

相关文章

  • 回文自动机(回文树)学习笔记
    回文自动机(回文树)学习笔记前置知识建议提前学习Manacher算法和其他任何一种自动机,方便理解,不过不学问题应该也不大。定义回文自动机(PAM),也称回文树,是存储一个字符串......
  • KMP算法学习记录
    KMP算法作用:用于字符串匹配。1准备前缀:指不包含最后一个字符的所有以第一个字符开头的连续子串。后缀:指不包含第一个字符的所有以最后一个字符结尾的连续子串。next[......
  • PAM(回文自动机/回文树)
    一个由小写字母构成的字符串\(s\),对于\(s\)的每个位置,求出以该位置结尾的回文子串个数。这个字符串被进行了加密,除了第一个字符,其他字符都需要通过上一个位置的答案来......
  • 质因数+树形DP例题
    题目:https://www.codechef.com/submit/MAKEIT1?tab=statement题解:https://www.codechef.com/submit/ROCKET_PACK?tab=solution代码:#include<bits/stdc++.h>#includ......
  • KMP
    字符串匹配算法时间复杂度O(n+m)#include<bits/stdc++.h>usingnamespacestd;#definelllonglong#defineendl"\n"#definesfscanf#definepfprintf#define......
  • [HNOI2004] L 语言 题解(AC 自动机上 dp)
    前言:原版数据超弱,爆搜就能过(即洛谷里面80分的数据),在此不多说,这里讲的是正解。(如果不是正解我还敢写题解吗)唔······话说洛谷里的题解用的都有状压,蒟蒻表示这题不......
  • [USACO12JAN]Video Game G【AC自动机+DP】
    “Canamanstillbebraveifhe’safraid?”“Thatistheonlytimeamancanbebrave.”每天六点多起床,整理好寝室内务后就去图书馆研读论文和处理邮件,完成后......
  • 带修莫队例题详解
    带修莫队[P1903国家集训队]数颜色/维护队列版本更新内容:在普通莫队基础上增加时间坐标,提高游戏难度;排序时以时间坐标为第三关键字,奇偶排序玄学值上调\(20\%\);代......
  • KMP算法——深入骨髓的领悟
    前缀函数与KMP算法真前缀:S中不全等于S的前缀前缀函数定义\(s[0\dotsi]\)的真前缀与真后缀相等的最大长度为\(\pi(i)\)。规定\(\pi(0)=0\)。计算前缀函数1.朴......
  • 扩展kmp
    扩展kmp扩展kmp处理的问题:字符串S和字符串T,求S的每个后缀与T的最长公共前缀nxt数组与kmp的不一样charS[N],T[N];intn,m,nxt[N],extend[N];//nxt[i]表示从T[i......