首页 > 其他分享 >「解题报告」CF1738H Palindrome Addicts

「解题报告」CF1738H Palindrome Addicts

时间:2023-06-15 20:22:49浏览次数:50  
标签:Palindrome int CF1738H len Addicts MAXN fail pam 回文

神秘回文串题。

首先容易发现要求的是区间本质不同回文串个数,所以直接上论文做法即可。

容易想到增量构建回文自动机,假如现在建出了 \([1, r]\) 的 PAM,考虑有多少回文串出现在了 \([l, r]\) 内。考虑记录每个回文串的最后一次出现位置 \(last_p\),那么这个串的左端点就是 \(last_p - len_p + 1\),也就是需要满足 \(last_p \ge l + len_p - 1\) 那么这个回文串就会造成贡献。

考虑每次插入一个字符时,找到当前的最长的回文串节点后,我们要更新的 \(last_p\) 实际上就是当前节点到根的每一个节点。直接维护好像不是很好维护,我们先观察下性质。根据 PAM 的构造过程容易发现,每拓展一次之后最多只增加一个本质不同的回文串,同理,删除一个字符之后也就最多减少一个本质不同回文串,那么我们其实只需要知道被删除的这一个回文串是哪个就行了。而又容易发现,这个回文串一定满足左端点 \(=l\),且没有任何以它为前缀的更长的回文串(否则这个串一定出现不止一次),也就是在 \(fail\) 树上它是叶子。我们每次删除只删除一个叶子,那么修改的时候实际上也就不需要修改整条链了,只需要给链底打个标记,当这个节点成为叶子被删除后再将标记往上传。整个过程是均摊 \(O(n)\) 的。

#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1000006;
int n;
char s[MAXN];
char op[20];
int ans;
struct PalindromeAutomaton {
    int t[MAXN][26], fail[MAXN], len[MAXN];
    int tag[MAXN], deg[MAXN];
    vector<int> e[MAXN];
    int tot, now;
    PalindromeAutomaton() {
        fail[0] = fail[1] = 1, len[1] = -1;
        tot = 1, now = 0;
    }
    void insert(int c, int pos) {
        int p = now;
        while (s[pos - len[p] - 1] != s[pos]) p = fail[p];
        if (!t[p][c]) {
            int np = ++tot;
            int q = fail[p];
            while (s[pos - len[q] - 1] != s[pos]) q = fail[q];
            fail[np] = t[q][c], len[np] = len[p] + 2, t[p][c] = np;
        }
        now = t[p][c];
    }
    void pushTag(int p, int v) {
        if (p > 1) {
            if (tag[p] == 0) ans++, deg[fail[p]]++;
            if (tag[p] < v) tag[p] = v, e[v - len[p] + 1].push_back(p);
        }
    }
    int jump(int p, int l) {
        while (len[p] > l) p = fail[p];
        return p;
    }
} pam;
int main() {
    scanf("%d", &n);
    int l = 1, r = 0;
    while (n--) {
        scanf("%s", op);
        if (op[1] == 'u') {
            scanf(" %c", &s[++r]);
            pam.insert(s[r] - 'a', r);
            pam.now = pam.jump(pam.now, r - l + 1);
            pam.pushTag(pam.now, r);
        } else {
            for (int p : pam.e[l]) {
                if (pam.tag[p] == l + pam.len[p] - 1 && pam.deg[p] == 0) {
                    pam.pushTag(pam.fail[p], pam.tag[p]);
                    pam.deg[pam.fail[p]]--, ans--, pam.tag[p] = 0;
                }
            }
            l++;
        }
        printf("%d\n", ans);
    }
    return 0;
}

标签:Palindrome,int,CF1738H,len,Addicts,MAXN,fail,pam,回文
From: https://www.cnblogs.com/apjifengc/p/17484031.html

相关文章

  • (博弈论)Even Number Addicts
    Alice和Bob正在一个序列 ai​ 上玩游戏,Alice先手,轮流玩。每一轮当前玩家可以取走序列中任意一个数,直到取完。如果最后Ailce取走的数的和为偶数,则Ailce赢,否则Bob赢。保证每个人用最优策略玩。对于每组数据,输出赢家。输入输出样例输入#1复制4313541357......
  • Palindrome Number
    Givenanintegerx,returntrueifxisapalindrome,andfalseotherwise.Example1:Input:x=121Output:trueExplanation:121readsas121fromlefttorightandfromrighttoleft.Example2:Input:x=-121Output:falseExplanation:Fromleftto......
  • CF 570E - Pig and Palindromes
    https://codeforces.com/problemset/problem/570/E双向DP,类似于摘樱桃:https://leetcode.cn/problems/cherry-pickup/记忆化搜索,超内存#include<vector>#include<string>#include<functional>#include<iostream>usingnamespacestd;intmain(){ int......
  • leetcode 409. Longest Palindrome
    Givenastringwhichconsistsoflowercaseoruppercaseletters,findthelengthofthelongestpalindromesthatcanbebuiltwiththoseletters.Thisiscasesensitive,forexample"Aa"isnotconsideredapalindromehere.Note:Assumethelength......
  • CF1512C A-B Palindrome 题解
    CF1512CA-BPalindrome题解Link洛谷CodeforcesDescription给出\(T\)个只由0、1和?组成的字符串\(s\),将字符串中的?替换成0或1之后形成一个回文串并且恰好有\(a\)个0和\(b\)个1,无解输出-1。Solution首先,若不考虑?原串不为回文串一定无解,输出-1即......
  • Partitioning by Palindromes - UVa 11584
    例题9-7划分成回文串(PartitioningbyPalindromes,UVa11584)#dp#线性dp#字符串回文#T3输入一个由小写字母组成的字符串,要求把它划分成尽量少的回文串。输出最少的个数。如aaadbccb最少可以划分为3个:aaa,d,bccb输入:第一行输入一个n表示数据组数接下来n行每行输入一个......
  • CF1823D Unique Palindromes
    题意你要构造一个长度为\(n\)的由小写字母组成的字符串,满足给出的\(k\)个约束。其中,每个约束以\(p(x_i,c_i)\)的方式给出,表示构造的字符串长度为\(x_i\)的前缀中应包含\(c_i\)个本质不同的回文子串(单个字符也算)。\(3\len\le2\times10^5\),\(1\lek\le20\)。......
  • D. Unique Palindromes
    D.UniquePalindromesApalindromeisastringthatreadsthesamebackwardsasforwards.Forexample,thestringabcbaispalindrome,whilethestringabcaisnot.Let$p(t)$bethenumberofuniquepalindromicsubstringsofstring$t$,i.e.thenumber......
  • codeforces 159D D. Palindrome pairs( manacher+dp )
    题目链接:codeforces159D题目大意:给出一个字符出,求取这个字符串中互相不覆盖的两个回文子串的对数。题目分析:首先能够用manacher模板,因为这个算法处理的字符串的长度式奇数,所以我们首先将原字符串拓展,也就是用一个没有出现过的子串填充到每两个字符之间,首位也要添加,这样处理后得到......
  • Palindrome
    PalindromeTimeLimit:4000/2000ms(Java/Other)   MemoryLimit:65536/32768K(Java/Other)TotalSubmission(s):72   AcceptedSubmission(s):19ProblemDescriptionApalindromeisasymmetricalstring,thatis,astringreadidenticallyfromle......