各种字符串处理算法
后缀数组,后缀自动机,ac自动机等等
a1214034447
这个作者很懒,什么都没留下…
展开
-
CodeForces #545(div.2)题解
题目链接:http://codeforces.com/contest/1138A. Sushi for Two解题思路:利用"缩点"变成1,2,1,2...或者2,1,2,1...的模式然后每个点都有权值,权值就是原序列相同连续段的总数。最后枚举相邻的两个取max就好了。#include<iostream>#include<cstdio>#inc...原创 2019-03-14 14:14:05 · 169 阅读 · 0 评论 -
ACM-ICPC Nanjing Onsite 2018 M - (扩展KMP+manacher算法)
题目链接:https://nanti.jisuanke.com/t/33682解题思路;对于s串的某个点i的贡献就是以i点为左边界在s串上有多少种回文串(记为x)这些回文串可以插在中间,那么右端自然是t的前缀,左端就是t前缀的倒置。求t前缀的倒置不就是将s倒过来看,取求s中的i节点为开头与t的最长前缀公共子串长度吗?(长度记为y)所以这个可以倒过来后用扩展KMP求得。之后对于i点...原创 2018-12-02 13:44:00 · 195 阅读 · 0 评论 -
hdu 6153 - 扩展kmp
知识链接:点击打开链接题目链接:点击打开链接解题思路:将串反过来就是看公共前缀长度了,然后用扩展kmp在用上等差求和就可以轻松解决#include<bits/stdc++.h>using namespace std;typedef long long ll;const int mx = 1e6+10,mod = 1e9+7;int nexts[mx],Pextend[mx];...原创 2018-03-13 22:08:53 · 197 阅读 · 0 评论 -
poj 1743 - 后缀自动机或后缀数组
后缀自动机:利用right集合的包含关系,利用一开始的原串的前缀串的最右端,去更新其他点right集合右端点包含它的子串出现的右端点位置,然后用最大位置减去最小位置和l【i】的关系看是否有重复#include<iostream>#include<algorithm>#include<cstdio>#include<cstring>#defin...原创 2018-04-11 16:09:59 · 216 阅读 · 0 评论 -
UVALive 7902 - 后缀数组
题解思路:考虑将所有的串都连起来,并且每个串本来的最后一个位置,这样防止之后考虑排名的时候会越界,设第一个字符串的长度为len,那么我们为0-len内的位置按排名从大到小枚举出来,这样就只考虑长度了不用再考虑大小了。那么我们以枚举的这个排名位置前后去扫描得出最大相同长度,因为要找到位置是在len之外。#include#include#include#include#incl原创 2017-12-10 23:24:32 · 205 阅读 · 0 评论 -
hdu 6194 - 后缀数组+线段树
题目链接:点击打开链接题解思路:用后缀数组处理得到的hight数组后,对它再进行线段建树,维护的是区间内最小的一个值,那么我们每次取枚举一个长度为n的区间时,取它的最小值这表示从1-ans_min的字符串长度都是满足的,那么题目还要求正好n次重复,那么我们就再取两次一个的左边界加一的区间值,一个是右边界加一的区间值,取两值的max那么此区间可取范围就应该是(左右边界+1的max,ans_min原创 2017-09-10 23:33:45 · 1311 阅读 · 0 评论 -
hdu 5769-后缀数组
题目链接:点击打开链接题解:利用后缀数组处理排名,枚举每个位置的后面离它最近的一个X位置和这个位置+height[i]取max(这就可以避免重复),然后用len-这个位置后面还有的数量就行了。代码:#include#include#include#include#includeusing namespace std;typedef long long ll;c原创 2017-06-09 20:38:12 · 248 阅读 · 0 评论 -
hdu 3518-后缀数组(无重叠子串)
链接:点击打开链接题解:利用后缀数组先排序,然后求出连续>=k的hight,然后判断最大差距有没有超过就行了。代码:#include #include #include using namespace std; const int N=1e3+10; char s[N];int wx[N],wy[N],sa[N],ws[N],ran[N],hig原创 2017-05-19 18:08:25 · 235 阅读 · 0 评论 -
牛客想开了大赛2 题解
题目链接:https://ac.nowcoder.com/acm/contest/907#questionA.【六】平面公式:(n*n+n)/2 + 1,n为直线数目B.【一】n的约数枚举质因子和每个质因子的个数,显然个数肯定从多到少。#include<bits/stdc++.h>typedef long long ll;using namespace ...原创 2019-06-01 17:05:51 · 136 阅读 · 0 评论 -
Gym - 101174E[AC自动机+DP]
题目链接:https://vjudge.net/problem/Gym-101174E解题思路:数据小,首先想可以不可以DP(虽然我一开始傻了没有往这个方向想)将n个串建一个AC自动,然后用dp[i][j][k]表示选取了长度为i的密码长度,这个密码后缀对应自动机上的节点j,k是三个字符的选择情况的二进制,然后就是标记不可包含的节点,之后就可以在AC自动机上跑DP了。#in...原创 2019-05-08 17:41:22 · 197 阅读 · 0 评论 -
hdu 6156 - 打表
题目链接:点击打开链接题解思路:因为以10进制来说,1位的回文串有9个,2位的有9个,3位的有90个,那么我们发现没差两位他们的倍增方式是乘以进制原始值为进制减一。那么我们就可以根据这个来事先打表。代码:#include <iostream>#include <cstdio>#include<set>#include<...原创 2017-08-23 18:46:13 · 276 阅读 · 0 评论 -
ACM-ICPC 2018 南京赛区网络预赛 I题 - 回文自动机
题目链接:点击这里解题思路:首先我们知道一个长度为n的字符串的所有不同的子串不会超过2*n种,所以不同的回文子串自然不会超过n种。对于回文自动机,与AC自动机相同的是也有一个fail指针指向第一个相近的且被其包含的一个回文串.所以建树方法基本与ac自动机相同,不懂自动机的可以去查。#include<bits/stdc++.h>using namesp...原创 2018-09-01 21:03:21 · 332 阅读 · 2 评论 -
hdu 2222 -AC自动机入门
题目链接:点击打开链接解题:经典AC自动机题目代码:#include<iostream>#include<algorithm>#include<stdio.h>#include<string.h>#include<queue>using namespace std;typedef long lo...原创 2017-06-08 17:27:02 · 250 阅读 · 0 评论 -
hdu 4511-AC自动机+DP
题目链接:点击打开链接解题思路:根据m点的限制构造树。用dp【i】【j】表示到i位置且在自动机上j节点位置时的最小距离。然后用floyed就OK了。代码:#include<iostream>#include<cstdio>#include<algorithm>#include<cstring>#include&...原创 2017-07-15 11:23:30 · 303 阅读 · 0 评论 -
hdu 6138 - AC自动机
题目链接:点击打开链接题解思路:先建立一个字典树,然后记住每个节点的深度,在求出每个节点的失败指针,将x的自身节点和x所以节点的所以失败指针都标记,再用y去搜索是否他自己的节点和自己节点的所以失败指针是否被标记过,如果是那么这点可以被考虑是否是在长的值。代码:#include<iostream> #include<algorithm> ...原创 2017-08-18 20:35:54 · 427 阅读 · 0 评论 -
CF #470 div2 D - 字典树或模拟
解题思路:这题字典树比较好处理,我们肯定是从P中找出按高位优先相同位的来找,也就是说,从高位开始匹配尽量找到与Ai最像的,如果在第j位没有的话只能在ans上加上了,然后删除的话也很好删除,只要将节点v值减一就行了。另外一个set模拟有点难理解,也难说就不说了,下面也有代码字典树:#include<bits/stdc++.h>using namespace std;...原创 2018-03-16 21:42:38 · 144 阅读 · 0 评论