字符串处理
sun.strick
这个作者很懒,什么都没留下…
展开
-
垃圾ac自动模板
于是现在才会写自动机一定是要遭人嘲笑得了。 #include #include #include #include #include #include #include #include #define Clear(s) memset((s),0,sizeof((s))) using namespace std; const int N = 1000010; const int原创 2016-07-09 20:27:24 · 500 阅读 · 0 评论 -
双回文pam写法
Lx神犇说我这种写法就是核弹打蚊子。。。但是我不会马拉车啊。而且这个算法也是我上通技课的时候突然想到的。。。首先pam这个东西非常神而且特别好记忆(虽然一开始被坑了一下)基本上熟了之后敲板子都不怎么要动脑子。而且功能异常强大。但是对于这道题我们构想双回文首先他肯定要是四的倍数其次他要是回文串。对于这两点pam做起来都很容易。然后怎么判断在回文串中平分之后还是回文串呢。显然我们应该到失陪边那里找线索原创 2016-08-22 19:38:31 · 344 阅读 · 0 评论 -
b179 cans
题目还是比较有意思也蛮好懂。。。,首先用病毒健串 ,首先dp[i][j][k] 表示 第i天 长度为j,在ac 自动机上走到了k节点的状态多少。当然可以滚动一下,然后考虑两个回答。一个扔进垃圾桶的很简单。只要dp[day][1][k]都加入ans1即可。 关键点是。 如果现在这个串长度大于在ac自动机上走到的点。那么显然删除首字母还在这个位置、反之就去找他的fail指针。然后如果走到了单词结尾原创 2016-08-22 19:27:47 · 277 阅读 · 0 评论 -
poj2778
大概是刚才那题的升级版。。。。思 想非常得神。 #include #include #include #include #include #include #include using namespace std; #define forup(i,a,b) for(int i=a;i<=b;i++) #define fordown(i,a,b) for(int i=a;i>=b;i--) #转载 2016-08-21 12:09:39 · 287 阅读 · 0 评论 -
第一次看AC自动机上的dp
给n个字母,构成长度为m的串,总共有n^m种。给p个字符串,问n^m种字符串中不包含(不是子串)这p个字符串的个数。 将p个不能包含的字符串建立AC自动机,每个结点用val值来标记以当前节点为后缀的字符串是否包含非法字符串(p个字符串中的任何一个)。 状态转移方程:f(i, j) += f(i-1, k) f(i, j)表示长度为i的字符串,结尾为字符j,方程j和k的关系可转载 2016-08-21 12:06:35 · 888 阅读 · 0 评论 -
spoj220
#include #include #include #include #include #include #include #include #include #include #include #include using namespace std; #define LS 2*i转载 2016-08-07 20:54:48 · 393 阅读 · 5 评论 -
poj3415
不得不说height数组确实是个很神的东西,这道题就是维护一个单调队列然后使里面的值递增,我们考虑为什么可以这么做。因为height数组的传递性(姑且这么叫吧) 例如height 有一段为3 4 5 下一个如果为2那么对之前出现的后缀的影响每个都是2,并且对于之后的后缀,除了2之外其他的数据都是没有用的,所以只需保留2,所以最后就会维护出一个递增序列 #include #include原创 2016-08-07 20:38:05 · 397 阅读 · 3 评论 -
poj3450
题意:求多个字符串的最长公共子串 思路:虽然这道题的最优解不是后缀数组,但是还是学习一下后缀数组的做法,还是和以前一样二分长度,然后再分开计数 [cpp] view plain copy #include #include #include #include #include #转载 2016-08-07 20:31:49 · 225 阅读 · 2 评论 -
poj2774
好像这个不是最优算法。。。但是确实是个模板题 #include #include #include #include #include #include #include #include #include #include #include #include #include #in原创 2016-08-07 20:29:51 · 204 阅读 · 4 评论 -
后缀数组模板
int n; int a[maxn]; int sum[maxn],rk[maxn],r1[maxn],r2[maxn],sa1[maxn],sa2[maxn],height[maxn]; void solve() { forup(i,1,n) sum[a[i]]++; forup(i,1,26) sum[i]+=sum[i-1]; forup(i,1,n)原创 2016-08-07 20:23:47 · 154 阅读 · 0 评论 -
poj3693 后缀数组+RMQ
感觉思路还是非常神奇的。另外注意一下strlen好像是个on的函数。。。日狗。。tle了一个晚上。 #include #include #include #include using namespace std; #define maxn 100005 #define forup(i,a,b) for(int i=(a);i<=(b);i++) #define fordown(i,b,a)原创 2016-08-28 19:16:30 · 347 阅读 · 0 评论 -
3689
这道题方法挺神奇的。我们考虑比较小的是什么情况。。显然是在前几位进行了(自交。。。)然后就有一个非常奇奇怪怪的做法。枚举层数。看看每一层自交之后能产生多少数字当某一层自交产生的数小于k的时候。那么就把它上一层自交能产生的所有数字都排个序。然后取前k个即可。 #include #include #include #include #include #include #define ll long转载 2016-07-15 20:28:33 · 718 阅读 · 0 评论 -
不会马拉车的煞笔要学pam
每个字符做两次失配操作,一次为当前节点找回文长度,另一次构造新的节点 至于那个奇数根偶数根,稍微记一下就好了,毕竟考场推有点蛋疼 #include #include #include #include #include #include #include #include #include #include #define ll long long using names转载 2016-08-11 22:15:30 · 356 阅读 · 0 评论