字符串
青烟绕指柔!
我不怕千万人阻挡,只怕自己投降。
展开
-
Video Game G
题目链接:Video Game G用AC自动机优化状压dp,然后记得统计一下fail树上的值。AC代码:#pragma GCC optimize("-Ofast","-funroll-all-loops")#include<bits/stdc++.h>//#define int long longusing namespace std;const int N=3010;int n,m,dp[1010][N],res; char str[N];int ed[N],fail[N原创 2021-06-23 19:51:28 · 116 阅读 · 0 评论 -
SZA-Template
题目链接:SZA-Template首先我们可以发现,答案一定是整个串的一个border。什么border是合法的呢?就是可以覆盖到所有点。我们用border树考虑,也就是每个节点相邻的最大差值要小于等于当前border长度。所以我们可以建树之后,从根节点一直向点n跑,直到存在一个合法的border,对于删除操作,我们使用链表维护即可。AC代码:#pragma GCC optimize("-Ofast","-funroll-all-loops")#include<bits/stdc++.h原创 2021-06-22 19:24:10 · 264 阅读 · 0 评论 -
[NOI2014] 动物园
题目链接:[NOI2014] 动物园维护一个border 树,然后对于每个点,继承父亲的答案,暴力向下跳即可。因为由于border树的性质,跳到的全是当前点的border为了方便向下跳,我们维护一个根节点到当前节点的节点栈AC代码:#pragma GCC optimize("-Ofast","-funroll-all-loops")#include<bits/stdc++.h>//#define int long longusing namespace std;const原创 2021-06-22 13:28:28 · 235 阅读 · 0 评论 -
Border树
题目链接:失配树就是把kmp求失配数组的时候,点 i 的父亲为 fail[i]然后这个树有几个性质:点的所有祖先一定是本身的border任意两个点的lca的任意祖先是共同的border没有祖先关系的两个点没有border关系所以求一求lca即可,记得判断lca的位置。AC代码:#pragma GCC optimize("-Ofast","-funroll-all-loops")#include<bits/stdc++.h>//#define int long long原创 2021-06-22 12:48:59 · 395 阅读 · 0 评论 -
Elastic Search
题目链接:Elastic Search我们不难发现,对于一个串,就是一直找子串,然后求一下找的最大次数。我们可以发现,我们对于一个有子串关系的暴力建图,然后求最长路即可。这里复杂度肯定不行,我们可以注意到,每次假设可以到 abba,也可以到ab,那么一定是前者。所以相当于就是AC自动机上面每次跳fail的一个dp。这里为了保证复杂度,每个节点只访问一次,所以需要记忆化。AC代码:#pragma GCC optimize("-Ofast","-funroll-all-loops")#incl原创 2021-06-15 22:12:24 · 169 阅读 · 0 评论 -
Adnan and the Burned drivers
题目链接:Adnan and the Burned drivers显然维护正反字符串的哈希值,那么直接判断即可。由于有修改,所以用线段树维护。AC代码:#pragma GCC optimize("-Ofast","-funroll-all-loops")#include<bits/stdc++.h>#define int long longusing namespace std;const int N=1e5+10;const int mod=1e9+3,base=131;原创 2020-07-05 13:37:32 · 236 阅读 · 0 评论 -
Censoring S
题目链接:Censoring S因为每次都是找一个个位置,所以我们可以考虑用一个栈维护最早出现的位置。然后怎么判断当前栈顶的字符串是否满足呢?AC自动机或者字符串hash都可。AC代码:#pragma GCC optimize("-Ofast","-funroll-all-loops")#include<bits/stdc++.h>#define int long longusing namespace std;const int N=1e6+10;const int mo原创 2020-07-01 23:47:06 · 330 阅读 · 0 评论 -
[POI2010]ANT-Antisymmetry
题目链接:[POI2010]ANT-Antisymmetry显然长度只可能是偶数。所以我们可以枚举每一段的右半段的左端点。然后把字符串反转,二分即可。check字符串相等直接哈希。AC代码:#pragma GCC optimize("-Ofast","-funroll-all-loops")#include<bits/stdc++.h>#define int long longusing namespace std;const int N=5e5+10,mod=1e9+3原创 2020-06-04 18:45:54 · 246 阅读 · 0 评论 -
SP1811 LCS
题目链接:SP1811 LCS对串A建立SAM,计算每一个b字符结尾的答案。对于当前字符有向下的转移就直接 len++,跳过去。否则一直向上跳父亲。AC代码:#pragma GCC optimize("-Ofast","-funroll-all-loops")#include<bits/stdc++.h>//#define int long longusing na...原创 2020-03-30 11:40:02 · 204 阅读 · 0 评论 -
不同子串个数
题目链接:不同子串个数如果我们考虑枚举左端点:我们可以发现如果新加了一个原本存在的子串,那么新加的必然是与前一个左端点的LCP。所以我们后缀数组求出Height数组即可。AC代码:#pragma GCC optimize("-Ofast","-funroll-all-loops")#include<bits/stdc++.h>//#define int long lo...原创 2020-02-13 13:20:02 · 375 阅读 · 0 评论 -
Codeforces - Watto and Mechanism
题目链接:Codeforces - Watto and Mechanism我们可以采用hash值来看是否存在某个字符串。所以我们对一个字符串每次枚举每个位置不同,然后看是否存在这个hash值即可。codeforces上面一般都必须双hash,否则Hack。然后一般双哈希都是采用孪生素数1e9+7 , 1e9+9.AC代码:#pragma GCC optimize("-Ofast","...原创 2020-02-12 18:25:59 · 188 阅读 · 0 评论 -
[JSOI2007]字符加密
题目链接:[JSOI2007]字符加密如果我们把字符串复制一份,拼接到后面。我们可以发现,字符串的所有旋转之后的串,都会存在于拼接之后的字符串后缀当中。(多出来的不会影响,很好证明)。所以实际上我们对拼接后的字符串后缀排序,只要排名为i的sa[i]小于等于最开始字符串长度len,那么这个排名就是合法的,所以我们从小到大枚举即可。AC代码:#pragma GCC optimize("-O...原创 2020-02-09 18:16:51 · 195 阅读 · 0 评论 -
[SHOI2011]双倍回文
在建立PAM求len的同时,我们要求出trans。trans 指针的含义是小于等于当前节点长度的一半最长回文后缀。当我们新建一个节点后,如果它的长度小于等于 2,那么这个节点的 trans 指针指向它的 fail 节点否则的话,我们同理从它父亲的 trans 指针指向的节点开始跳 fail 指针直到跳到某一个节点所表示的回文串的两侧都能扩展这个字符并且拓展后的长度小于等于当前节点长度...原创 2020-01-11 11:11:29 · 286 阅读 · 0 评论 -
回文串
枚举分割线,对两边分别求最大回文串然后加起来。可以PAM或者马拉车。因为每次只插入一个字符,所以总共复杂度是 O(n*log26) ,或者 O(n)。AC代码:#pragma GCC optimize("-Ofast","-funroll-all-loops")#include<bits/stdc++.h>//#define int long longusing na...原创 2020-01-10 21:38:57 · 255 阅读 · 0 评论 -
ACM-ICPC Asia Beijing Regional Palindromes
Recently, Nvoenewr learnt palindromes in his class.A palindrome is a nonnegative integer that is the same when read from left to right and when read from right to left. For example, 0, 1, 2, 11, 99, ...原创 2019-10-24 22:22:02 · 285 阅读 · 0 评论 -
子串查询
题目描述给出一个长度为n的字符串s和q个查询。对于每一个查询,会输入一个字符串t,你需要判断这个字符串t是不是s的子串。子串的定义就是存在任意下标a<b<c<d<e,那么”s[a]s[b]s[c]s[d]s[e]”就构成s的一个子串。如”abc”的子串有”a”、”b”、”c”、”ab”、”ac”、”bc”、”abc”。输入描述:第一行两个数n,q。1<=n,q&...原创 2019-09-06 21:57:42 · 528 阅读 · 0 评论 -
KMP模板
#include<bits/stdc++.h>using namespace std;int next[1000010],n,l1,l2;char s1[1000010],s2[1000010];vector<int> res;void get_next(char *s){ next[0]=next[1]=0; int len=strlen(s+1); f...原创 2019-05-11 13:31:14 · 167 阅读 · 2 评论 -
项链(字符串最小表示法)
有一天,达达捡了一条价值连城的宝石项链,但是,一个严重的问题是,他并不知道项链的主人是谁!在得知此事后,很多人向达达发来了很多邮件,都说项链是自己的,要求他归还(显然其中最多只有一个人说了真话)。达达要求每个人都写了一段关于自己项链的描述: 项链上的宝石用数字0至9来标示。一个对于项链的表示就是从项链的某个宝石开始,顺指针绕一圈,沿途记下经过的宝石,比如项链: 0-1-2-3 ,它的可能的四...原创 2019-05-10 22:47:46 · 406 阅读 · 0 评论 -
Manacher(回文子串)
O(n)求一个字符串中的最大回文子串#include<bits/stdc++.h>using namespace std;const int N=100000+10;int n,num,res,p[N<<2];string a,b;char c[N<<2];void init(){ c[num++]='$'; c[num++]='#'; f...原创 2019-05-09 21:18:52 · 302 阅读 · 0 评论