长期留坑

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. FOV

    来源:https://blog.csdn.net/chepwavege/article/details/98876550 视场 (视图字段) 是指现场对面相机镜头的立体角.图如下图所示︰ 高频通气︰  ...

  2. puts()和gets()函数

    puts()和gets()函数 1. puts()函数 puts()函数用来向标准输出设备(屏幕)写字符串并换行, 其调用格式为: puts(s); 其中s为字符串变量(字符串数组名或字符串指针). ...

  3. 八、多线程爬虫(先占个位置,等整理好线程,进程,协程,异步IO在来写)

    计算机的核心是CPU,CPU承担了所有的计算任务. 一个CPU核心,一次只能执行一个任务: 多个CPU核心同时可以执行多个任务. 一个CPU一次只能执行一个进程,其他进程处于非运行状态. 进程里包含的 ...

  4. 微服务 | Spring Cloud(一):从单体SSM 到 Spring Cloud

    系列文章目录 微服务 | Spring Cloud(一):从单体SSM 到 Spring Cloud 目录 系列文章目录 前言 单体式架构 微服务架构 优点 缺点 服务发现与弹性扩展 参考 前言 在微 ...

  5. 多测师讲解接口测试 _面试题003_高级讲师肖sir

    接口测试 一.你对HTTP有没有了解过?具体讲一下对http的了解.(答题思路: 定义.常见请求类型.状态码.请求头请求体.响应头和响应体.三次握手和四次挥手.)答:了解,我们做接口的时候基本上都是基 ...

  6. 多测师讲解自动化测试 _RF连接数据库_高级讲师肖sir

    RF连接数据库:1.Connect To Database(连接数据库)2.Table Must Exist(表必须存在)3.Check If Exists In Database(查询某条件是否存在 ...

  7. selenium元素定位学习笔记

    一,定位原则 稳定 简单灵活 唯一 WebDriver提供了两种方式来定位页面元素,分别是find_element_by_XXX和find_elements_by_XXX.第一种方式的结果是在正常情况 ...

  8. 【数论】HDU 4143 A Simple Problem

    题目内容 给出一个正整数\(n\),找到最小的正整数\(x\),使之能找到一个整数\(y\),满足\(y^2=n+x^2\). 输入格式 第一行是数据组数\(T\),每组数据有一个整数\(n\). 输 ...

  9. 帮你解读什么是Redis缓存穿透和缓存雪崩(包含解决方案)

    一.缓存处理流程 前台请求,后台先从缓存中取数据,取到直接返回结果,取不到时从数据库中取,数据库取到更新缓存,并返回结果,数据库也没取到,那直接返回空结果. 二.缓存穿透 描述: 缓存穿透是指缓存和数 ...

  10. 第10天 | 12天搞定Python,文件操作(超详细)

    在开发系统的过程中,经常会用到XML存储和传输数据,XML是一种用于标记电子文件使其具有结构性的标记语言,在博客中经常会见到. JSON是一种轻量级的数据交换格式,常被用在后端和前端的数据交互上,如你 ...