首页 > 其他分享 >回文自动机

回文自动机

时间:2024-04-22 17:57:49浏览次数:24  
标签:r1 int cur len str fail 自动机 回文

求以每个节点结尾的,回文子串的个数,最大回文子串的长度
求回文串的总个数(必须连续)
不连续的是动态规划

#include<bits/stdc++.h>
using namespace std;
const int maxn = 500005;
char str[maxn];
struct PAM {
    int size, last, r0, r1;
    int trie[maxn][26], fail[maxn], len[maxn], cnt[maxn];
    PAM() {
        r0 = size++, r1 = size++; last = r1;
        len[r0] = 0, fail[r0] = r1;
        len[r1] = -1, fail[r1] = r1;
    }
    void insert(int ch, int idx) {
        int u = last;
        while (str[idx] != str[idx - len[u] - 1])u = fail[u];
        if (!trie[u][ch]) {
            int cur = ++size, v = fail[u];
            len[cur] = len[u] + 2;
            for (; str[idx] != str[idx - len[v] - 1]; v = fail[v]);
            fail[cur] = trie[v][ch]; trie[u][ch] = cur;
            cnt[cur] = cnt[fail[cur]] + 1;
        }
        last = trie[u][ch];
    }
    void build(char* str) {
        int len = strlen(str);
        for (int i = 0; i < len; i++) {
            insert(str[i] - 'a' + 1, i);
            //printf("%d ", cnt[last]);//在这个位置打印以每个节点为结尾的,字符串个数 
        }
    }
}pam;
int main(){
    scanf("%s", str);
    pam.build(str);
    
    
    
/*这个位置来打印各个节点的次数也可以,但是要从3开始*/
//    for(int i=3;i<=strlen(str)+2;i++)
//	{
//		cout<<pam.cnt[i]<<endl;
//	}
    return 0;
}

标签:r1,int,cur,len,str,fail,自动机,回文
From: https://www.cnblogs.com/yzzyang/p/18151114

相关文章

  • AC自动机
    二次加强版那个题距离最大内存,就差了一个ss数组了....96分#include<bits/stdc++.h>#definemaxn2000001usingnamespacestd;stringss[100000];chars[maxn],T[maxn];intn,cnt,vis[200051],ans,in[maxn],Map[maxn];structkkk{intson[26],fail,flag,ans;voi......
  • Bingbong的回文路径
    Bingbong的回文路径题目描述Bingbong有一棵有根树,根节点为$1$,总共有$n$个节点。树中的节点通过$n−1$条无向边相连,每条边的权重为$1$。树中的每个节点包含一个小写字母。Bingbong将选择从节点$u$开始,并在选择最短路径的情况下到达节点$v$。他想知道他所走路径形成的......
  • leetcode回文数
    给你一个整数x,如果x是一个回文整数,返回true;否则,返回false。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。例如,121是回文,而123不是。示例1:输入:x=121输出:true示例2:输入:x=-121输出:false解释:从左向右读,为-121。从右向左读,为121-。因此......
  • 【学习笔记】 字符串基础 : 后缀自动机(基础篇)
    本文只介绍关于\(\mathbf{SAM}\)的基本概念与实现后缀自动机是什么类似\(\text{AC}\)自动机,后缀自动机(\(\text{SAM}\))是能且只能接收字符串所有后缀的自动机我们首先要知道,\(\mathbf{SAM}\)是只能接收所有后缀的结构而不是只能维护后缀的结构事实上\(\mathbf{SAM}\)......
  • 马拉车Mananer(求最长回文子序列)
    直接上板子直接输出最长回文子序列的长度#include<bits/stdc++.h>#defineintlonglong#defineIOSios::sync_with_stdio(0);cin.tie(0);cout.tie(0);usingnamespacestd;chars[32000005],st[32000005];intp[32000005];intchange(){intlen=strlen(st);......
  • Python案例:输出公元后到目前为止全部回文日期
    一、回文日期一个日期,如果顺读和倒读都一样,那么就称之为回文日期,比如今天:20211202,就是一个神奇的回文日期。二、提出任务输出公元后的全部回文日期要求每行输出五个回文日期统计总共有多少个回文日期三、完成任务(一)涉及知识点1、time模块time模块有两个常用函数time()......
  • 27天【代码随想录算法训练营34期】第七章 回溯算法part03(● 39. 组合总和 ● 40.组合
    39.组合总和怎么才能避免重复?比现在数小的数就别append到path里面了,之前肯定都试过了classSolution:defcombinationSum(self,candidates:List[int],target:int)->List[List[int]]:result=[]candidates.sort()self.backtracking(cand......
  • 《自动机理论、语言和计算导论》阅读笔记:p139-p171
    《自动机理论、语言和计算导论》学习第7天,p139-p171总结,总计33页。一、技术总结1.reversalp139,Thereversalofastringa1a2...anisthestringwrittenbackwards,thatisanan-1...a1.2.homomorphismAstringhomomorphismisafunctiononstringsthatwokrs......
  • AC 自动机
    参考博客:常见字符串算法II:自动机相关前置知识AC自动机结合了KMP和字典树的思想,将匹配放到字典树上,构建fail指针,实现多模匹配。先对模式串构建Trie。字典树上的一个节点对应了模式串的一个前缀,我们称其为一个状态。状态\(u\)的失配指针\(\text{fail}(u)\)指向状态......
  • 516. 最长回文子序列
    题目链接:本题考察区间\(dp\)。设\(f[i][j]\)表示子串\(i\simj\)中的最长回文子序列的长度。思考状态转移方程。因为是判断回文的问题,考虑首尾元素是否相同。若首尾元素相同,则考虑去掉首尾元素之后子串的最长回文子序列的长度+2(首、尾元素各一个)反之若首尾元素不相同......