长期留坑

1.AC自动机多模式串匹配问题

对于要统计各个模式串在文本中的出现次数,对于每个当前节点不能直接暴力跳$fail$

复杂可以退化到$O(n^2)$

$aaaaaa……aaa$可以卡掉

要将$fail$指针反向建出来,明显这是棵树,然后统计其子树大小

 1 #include <bits/stdc++.h>
2 using namespace std;
3 const int N=2*1e5+100;
4 int n,tot,wh[N],cnt[N];
5 struct node
6 {
7 int son[26],fail;
8 }sh[N];
9 string s,t;
10 vector <int> e[N];
11 void build(int x)
12 {
13 int p=1;
14 for (int i=0;i<(int)t.size();i++)
15 {
16 if (!sh[p].son[t[i]-'a'])
17 {
18 tot++;
19 sh[p].son[t[i]-'a']=tot;
20 }
21 p=sh[p].son[t[i]-'a'];
22 }
23 wh[x]=p;
24 }
25 void build_fail()
26 {
27 queue <int> q;
28 q.push(1);
29 while (!q.empty())
30 {
31 int x=q.front();
32 q.pop();
33 for (int i=0;i<26;i++)
34 {
35 if (!sh[x].son[i])
36 {
37 if (x==1)
38 sh[x].son[i]=1;
39 else
40 sh[x].son[i]=sh[sh[x].fail].son[i];
41 }
42 else
43 {
44 if (x==1)
45 sh[sh[x].son[i]].fail=1;
46 else
47 sh[sh[x].son[i]].fail=sh[sh[x].fail].son[i];
48 q.push(sh[x].son[i]);
49 }
50 }
51 }
52 }
53 void match()
54 {
55 int p=1;
56 for (int i=0;i<(int)s.size();i++)
57 {
58 p=sh[p].son[s[i]-'a'];
59 cnt[p]++;
60 }
61 }
62 void dfs(int x,int fa)
63 {
64 for (int i=0;i<(int)e[x].size();i++)
65 {
66 int u=e[x][i];
67 if (u!=fa)
68 {
69 dfs(u,x);
70 cnt[x]+=cnt[u];
71 }
72 }
73 }
74 int main()
75 {
76 tot=1;
77 scanf("%d",&n);
78 for (int i=1;i<=n;i++)
79 {
80 cin>>t;
81 build(i);
82 }
83 build_fail();
84 cin>>s;
85 match();
86 for (int i=2;i<=tot;i++)
87 {
88 e[i].push_back(sh[i].fail);
89 e[sh[i].fail].push_back(i);
90 }
91 dfs(1,1);
92 for (int i=1;i<=n;i++)
93 printf("%d\n",cnt[wh[i]]);
94 }

2.KMP询问字符串的最短循环节

如$abcabcabc$的最短循环节为$abc$

先处理出这个字符串的前缀函数

如果循环节的长度为$k$,字符串的长度为$n$

那么$nxt[n-1]=n-k$

移项可得$k=n-nxt[n-1]$

那么只要满足$n-nxt[n-1]\mid n$,$n-nxt[n-1]$就是最短循环节,否则就是$n$

 1 nxt[l]=0;
2 for (int i=l+1;i<=r;i++)
3 {
4 int j=nxt[i-1];
5 while (j>0 && ch[i]!=ch[j+l])
6 j=nxt[j-1];
7 if (ch[i]==ch[j+l])
8 j++;
9 nxt[i]=j;
10 }
11 int N,M;
12 N=r-l+1;
13 M=N-nxt[r];
14 if (N%M==0)
15 return M;
16 else
17 return N;

3.对于分段函数迭代

比如CF1271E

在画出函数转移树的时候,要注意不同对应法则的连边的两个数字是否满足该函数的不同的定义域

如CF1271E这道题,一定要注意$f(x)=x-1$是在偶数情况下满足,所以在二分时要分偶数奇数考虑

4.Splay的区间操作和权值操作

对于区间操作,在建树时就要将$1$和$n+1$建入平衡树中,避免进行区间操作时越界

对于权值操作,在建树时要将$inf$和$-inf$建入平衡树中,避免求前驱后继时越界

5.对于最小费用最大流的建图

在建图的时候一定要注意,建出来的图在满足题目限制条件的时候,跑费用流时,是不是满足最大流的情况

也就是说,要将题目中所有的限制条件建的边是要能跑出最大流的

否则不满足最大流,是谈不上最小费用的

6.高斯消元

在将把主对角线上的矩阵元素替换成非0元素时候,需要在对$i$行进行处理的时候之前才进行替换

不能先将所有的行替换好,在进行消元

2

1 1 2

3 3 6

就无法判断无穷解的情况

正确做法
错误做法

7.FFT的使用范围

FFT处理的是如同$c_i = \sum\limits_{j=0}^{i}a_jb_{i-j}$的卷积形式

FFT只是DFT的加速,处理出的是在$n+1$个单位元点下多项式的取值

FFT只能处理$2^{k}$次的卷积,对于不是$2$的幂次长度的卷积

对于两个长度为$n$的多项式,其卷积的长度应为$2n-1$,那么要找到$k$,使得$2^{k}>=2n-1$

然后进行循环卷积

8.主席树处理区间第k大

主席树相当于处理了一个前缀和,是满足可加、可减性的

所以也可以处理树上的问题

处理第k大的思想主要就是维护前缀和

9.树形背包

如果是在枚举子树的时候先累加$size$,那么复杂度为$O(n^3)$

需要先进行转移再累加$size$

这样相当于 $dp$ 的时候是当前子树大小乘上这个子树之前所有子树的大小之和,可以理解成该子树中每一个点与之前的所有子树里每一个点两两组成的点对被计算一次,这样的话每一对点都只会被计算一次(在它们的 $LCA$ 处),时间复杂度$O(n^2)$

并且注意要倒序转移

for (int p=first[x];p!=-1;p=nxt[p])
{
int u=point[p];
if (u==fa) continue;
for (int i=sz[x];i>=0;i--)
{
for (int j=sz[u];j>=0;j--)
{
if (i+j>背包容量) continue;
dp[x][i+j]=max(dp[x][i+j],dp[x][i]+dp[u][j]+价值函数);
}
}
sz[x]+=sz[u];
}

10.斜率优化--二分凸包

在二分凸包上的斜率的时候要注意要特判凸包上第一个点是否就是直线所切到的最佳决策点

如维护下凸包的时候,判断凸包上第一条线段的斜率是否大于当前直线的斜率,若大于直接返回第一个点

11.整体二分

在分治过程要函数开头判断当前是否还有操作的答案在$l$,$r$之间,如果没有直接返回,可以极大地减少常数

void solve(int x,int y,int l,int r)
{
if (x>y) return;//important!!
if (l==r)
{
……
}
……
}

12.左偏树的$dis$

在合并的过程中一定要保持$dis[0]=-1$来保证复杂度的正确

可以在$pushup$中开头加一句,以免有复杂操作会改变$dis[0]$的值

并且在$pop$的时候$dis$,$son$要重置为$0$,在重复利用时若$dis$不为$0$会出现问题

一些bug的更多相关文章

  1. Tomcat一个BUG造成CLOSE_WAIT

    之前应该提过,我们线上架构整体重新架设了,应用层面使用的是Spring Boot,前段日子因为一些第三方的原因,略有些匆忙的提前开始线上的内测了.然后运维发现了个问题,服务器的HTTPS端口有大量的C ...

  2. a标签点击跳转失效--IE6、7的奇葩bug

    一般运用a标签包含img去实现点击图片跳转的功能,这是前端经常要用到的东西. 今天遇到个神奇的bug:如果在img上再包裹一层div,而且div设置了width和height,则图片区域点击时,无任何 ...

  3. 关于 Chrome 浏览器中 onresize 事件的 Bug

    我在写插件时用到了 onresize 事件,在反复地测试后发现该事件在 Chrome 及 Opera(内核基本与 Chrome 相同,以下统称 Chrome)浏览器打开时就会执行,这种情况也许不能算作 ...

  4. Chrome出了个小bug:论如何在Chrome下劫持原生只读对象

    Chrome出了个小bug:论如何在Chrome下劫持原生只读对象 概述 众所周知,虽然JavaScript是个很灵活的语言,浏览器里很多原生的方法都可以随意覆盖或者重写,比如alert.但是为了保证 ...

  5. 一个粗心的Bug,JSON格式不规范导致AJAX错误

    一.事件回放  今天工作时碰到了一个奇怪的问题,这个问题很早很早以前也碰到过,不过没想到过这么久了竟然又栽在这里. 当时正在联调一个项目,由于后端没有提供数据接口,于是我直接本地建立了一个 json ...

  6. 了不起的 nodejs-TwitterWeb 案例 bug 解决

    了不起的nodejs算是一本不错的入门书,不过书中个别案例存在bug,按照书中源码无法做出和书中相同效果,原本兴奋的心情掺杂着些许失落. 现在我们看一下第七章HTTP,一个Twitter Web客户端 ...

  7. 应该是Angular2的一个bug?

    为了应对未来的趋势,及时赶上下一趟互联网技术,我最近也在通过具体项目研究angular2,首先必须要吐槽的是,学习angular2的成本本身不高,但是一堆的工具.配置实在让人 很是焦灼,就像asp.n ...

  8. 记录一次bug解决过程:数据迁移

    一 总结 不擅长语言表达,勤于沟通,多锻炼 调试MyBatis中SQL语法:foreach 问题:缺少关键字VALUES.很遗憾:它的错误报的让人找不着北. 二 BUG描述:MyBatis中批量插入数 ...

  9. 关于MJRefresh的下拉加载数据bug

    当没有更多数据的时候显示NoMoreData 我的理解是先结束刷新再显示没有更多 今天之前一直没发现有问题 贴之前的代码 [self.collectionView reloadData]; [self ...

  10. [异常特工]android常见bug跟踪

    前言 对app的线上bug的收集(友盟.云捕等)有时会得到这样的异常堆栈信息:没有一行代码是有关自身程序代码的.这使得对bug的解决无从下手,根据经验,内存不足OOM,Dialog关闭,ListVie ...

随机推荐

  1. Layman 分享到朋友圈或发送给朋友

    *主要是介绍如何在网页中实现发送给朋友和分享到朋友圈时内容参数自定义的功能 微信JS接口 1.微信JS-SDK是微信公众平台面向网页开发者提供的基于微信内的网页开发工具包; 通过使用微信JS-SDK, ...

  2. Python导入模块的几种方法

    Python 模块 Python 模块(Module),是一个 Python 文件,以 .py 结尾,包含了 Python 对象定义和Python语句. 模块让你能够有逻辑地组织你的 Python 代 ...

  3. 使用 Aria2 代替迅雷

    一.原因 迅雷下载速度一般,thunder:// 开头的链接也逐渐被 bt 链接替代. 迅雷很流氓,安装后 (尤其是 Windows 系统) 浏览器默认使用迅雷下载,对于小文件来说使用浏览器内置下载可 ...

  4. 014 01 Android 零基础入门 01 Java基础语法 02 Java常量与变量 08 “字符型”字面值

    014 01 Android 零基础入门 01 Java基础语法 02 Java常量与变量 08 "字符型"字面值 字符型 字面值如何表示? 两个关键:单引号(必须是英文单引号). ...

  5. NOIP提高组2016 D2T3 【愤怒的小鸟】

    貌似还没有写过状压DP的题目,嗯,刚好今天考了,就拿出来写一写吧. 题目大意: 额,比较懒,这次就不写了... 思路分析: 先教大家一种判断题目是不是状压DP的方法吧. 很简单,那就是--看数据范围! ...

  6. day20 Pyhton学习 面向对象-类与类之间的关系

    一.类与类之间的依赖关系 class Elphant: def __init__(self, name): self.name = name def open(self, ref): print(&q ...

  7. ES6的7个实用技巧

    Hack #1 交换元素 利用数组解构来实现值的互换 let a = 'world', b = 'hello' [a, b] = [b, a] console.log(a) // -> hell ...

  8. 最近集训的图论(思路+实现)题目汇总(内容包含tarjan、分层图、拓扑、差分、奇怪的最短路):

    (集训模拟赛2)抢掠计划(tarjan强) 题目:给你n个点,m条边的图,每个点有点权,有一些点是"酒吧"点,终点只能在"酒吧",起点给定,路可以重复经过,但点 ...

  9. Redis Lua脚本完全入门

    1. 前言 Redis是高性能的KV内存数据库,除了做缓存中间件的基本作用外还有很多用途,比如胖哥以前分享的Redis GEO地理位置信息计算.Redis提供了丰富的命令来供我们使用以实现一些计算.R ...

  10. MySql中varchar和char,如何选择合适的数据类型?

    背景 学过MySQL的同学都知道MySQL中varchar和char是两种最主要的字符串类型,varchar是变长的类型,而char是固定长度.那关于如何选择类型就成为令人头疼的事,很多初学者为了保证 ...