20150325

来源:互联网 发布:买淘宝店铺哪个网站 编辑:程序博客网 时间:2024/06/18 08:10
nico
30%:裸AC自动机,每次加入一个单词之后就重新bfs建fail指针,复杂度O(n^2+m)。
60%:考虑对加入单词的操作进行分块,建立一大一小两个AC自动机,设总长度为l,每加入一个单词就将其加入小自动机并重新bfs,如果小自动机的结点数达到了sqrt(n)则把小自动机中所有串插入大自动机并对大自动机重新bfs。小自动机大小为O(sqrt(n)),bfs的次数为O(n),大自动机大小为O(n),bfs的次数为O(sqrt(n)),总复杂度为O(n*sqrt(n)+m),视评测机效率也可能可以得到100%的分数。
100%:考虑将60%的算法中的两个自动机扩充到log(n)个,第i个自动机的容量上限为2^i,则每个自动机的bfs复杂度为O(n/(2^i))*O(2^i)=O(n),总复杂度为O((n+m)*log(n))。
另外也有离线的做法,由于加密方式的特点可以将字符串倍长之后用SA或者SAM处理,具体做法我不太清楚,放了一个代码在std里,感兴趣的可以去看看。

poi
30%:暴力,每次询问从询问点开始bfs,复杂度O(nm)。
100%:树分治,每个分治中心维护一个树状数组,记录该分治中心覆盖的结点到该分治中心距离为x的食物数量和,对于每个结点记录覆盖它的所有分治中心。计算答案时注意要减去和询问结点在同一棵子树中的结点的答案。树分治复杂度为分治复杂度O(n*log(n))*树状数组复杂度O(log(n))=O(n*log^2(n)),每个结点被O(log(n))个分治中心覆盖,即单次询问复杂度为分治中心数量O(log(n))*树状数组复杂度O(log(n))=O(log^2(n)),总复杂度为O((n+q)*log^2(n))。

nyapasu
30%:暴力(其实我并不知道暴力能不能拿到30%),复杂度O((b-a)*log(b))。
100%:数位DP转树形DP(见2009年刘聪的国家集训队论文《浅谈数位类统计问题》)。按位考虑,首先考虑个位,除了两边之外中间都是012...9的循环,高位同理。可先预处理出g[i][j][k]表示i经过10^k次和j的运算后的结果,再预处理出f[i][j][k]表示
i经过10^k次
{
    和10^j个0进行运算之后
    和10^j个1进行运算之后
    ...
    和10^j个9进行运算之后
}
的结果
(这一段没缩进我觉得我自己都会绕进去)。
剩下的就是在十叉树上进行遍历的过程了。
复杂度O(log^2(b))。
注意因为运算符只是左结合的,所以不能使用结合律。



0 0
原创粉丝点击