上一页 1 2 3 4 5 6 7 8 9 10 ··· 29 下一页
摘要: 指数型生成函数,推一推可得: $$ (1+\frac{x^1}{1!}+\frac{x^2}{2!}+\frac{x^3}{3!}+...)^2+(1+\frac{x^2}{2!}+\frac{x^4}{4!}+\frac{x^6}{6!}+...)^2 $$ $$ =e^{2x}+(\frac{e 阅读全文
posted @ 2018-11-26 10:09 lokiii 阅读(169) 评论(0) 推荐(0) 编辑
摘要: 按套路列生成函数式子然后暴力乘,这样复杂度看起来非常大,但是可以动态维护最大值,这样就是O(能过)的了 仔细想想这个多项式暴力乘理解成背包dp也行? 阅读全文
posted @ 2018-11-26 08:46 lokiii 阅读(126) 评论(0) 推荐(0) 编辑
摘要: 列出生成函数的多项式之后暴力乘即可 cpp include include include using namespace std; const int N=20005; int n,x,y,z,a[N],b[N]; int main() { while(scanf("%d%d%d",&x,&y,& 阅读全文
posted @ 2018-11-26 08:06 lokiii 阅读(124) 评论(0) 推荐(0) 编辑
摘要: 预处理出完全平方数就和普通的生成函数解整数拆分一样了 cpp include include using namespace std; const int N=605; int n,m,q[N],a[N],b[N]; int main() { for(int i=1;i 阅读全文
posted @ 2018-11-26 07:41 lokiii 阅读(94) 评论(0) 推荐(0) 编辑
摘要: 老是想着化简,实际上O(n^3)就行了…… 写成生成函数是\\( \prod_{i=1}^{n}(1+x^i+2^{2i}+...+x^{ \left \lfloor \frac{n}{i} \right \rfloor }) \\),暴力乘即可 cpp include include using 阅读全文
posted @ 2018-11-25 22:01 lokiii 阅读(79) 评论(0) 推荐(0) 编辑
摘要: 首先根据生成函数的套路,这个可以写成: $$ \prod_{i=1}^{n}(1+x^1+x^2+...+x^{c[i]}) $$ 然后化简 $$ =\prod_{i=1}^{n}\frac{1 x^{c[i]+1}}{1 x} $$ $$ =\prod_{i=1}^{n}\frac{1}{1 x} 阅读全文
posted @ 2018-11-25 21:37 lokiii 阅读(316) 评论(0) 推荐(0) 编辑
摘要: 这个输出可是有点恶心啊……WA\ inf,最后抄了别人的输出方法orz 还有注意会爆long long,要开unsigned long long 对于k==1,单独考虑每一位i,如果这一位为1则有0.5的概率贡献1 include include using namespace std; const 阅读全文
posted @ 2018-11-25 17:24 lokiii 阅读(185) 评论(0) 推荐(0) 编辑
摘要: 先按魔力值从大到小排序,然后从大到小插入线性基中,如果插入成功就加上这个魔力值 因为线性基里是没有异或和为0的集合的,所以正确性显然,然后最优性,考虑放进去一个原来没选的,这样为了可行性就要删掉一个,又因为是从大到小加进去的,所以删掉的这个魔力值一定是大于加进去的,所以不优,所以贪心构造的就是最优解 阅读全文
posted @ 2018-11-25 11:20 lokiii 阅读(152) 评论(0) 推荐(0) 编辑
摘要: 建回文自动机,注意到一个回文串是可以通过一个长度小于等于这个串长度的一半的回文串添上一些字符然后复制得到的,也就是在自动机上向fa走,相当于treedp 每次都走显然会T,记录一个up,指向祖先中最下长度符合要求的回文后缀,这样每次找最多跳一次,所以是O(n)的,还有child的清空动态的做,也就是 阅读全文
posted @ 2018-11-25 08:18 lokiii 阅读(141) 评论(0) 推荐(0) 编辑
摘要: manacher魔改,hash+二分都好写,但是我魔改了个回文自动机就写自闭了orz 根本上来说只要把==改成!=即可,但是这样一来很多停止条件就没了,需要很多特判手动刹车,最后统计一下size即可 cpp include include include using namespace std; c 阅读全文
posted @ 2018-11-24 16:47 lokiii 阅读(136) 评论(0) 推荐(0) 编辑
摘要: 回文自动机板子 或者是SAM+manacher+倍增,就是manacher求本质不同回文串(让f++的串),然后在SAM倍增查询对应点出现次数 cpp include include include using namespace std; const int N=300005; int n,ch[ 阅读全文
posted @ 2018-11-24 15:32 lokiii 阅读(138) 评论(0) 推荐(0) 编辑
摘要: 因为我很愚蠢所以用了很愚蠢的O(nlogn)的manacher+线段树做法 就是开两个线段树mn和mx分别表示左端点在i的最长回文子串和右端点在i的最长回文子串 用manacher求出每个点的最长回文子串,然后对于一组(i,f[i])(这里的i是加完 之后的串),我们考虑对原串贡献是对于中点右边一段 阅读全文
posted @ 2018-11-24 14:21 lokiii 阅读(198) 评论(0) 推荐(0) 编辑
摘要: 建个SAM,符合要求的串显然是|right|==1的节点多代表的串,设si[i]为right集合大小,p[i]为right最大的r点,这些都可以建出SAM后再parent树上求得 然后对弈si[i]==1的点,考虑它所代表的串是s(p[i] dis[i]+1,p[i])~s(p[i] dis[fa[ 阅读全文
posted @ 2018-11-24 09:24 lokiii 阅读(182) 评论(0) 推荐(0) 编辑
摘要: 首先只有lcp(i,j)需要考虑 因为SAM的parent树是后缀的前缀的最长公共后缀(……),所以把这个串倒过来建SAM,这样就变成了求两个前缀的最长公共后缀,长度就是这两个前缀在parent树上的lcs对应的最大长度dis 这里用treedp解决即可,就是合并一下size cpp include 阅读全文
posted @ 2018-11-23 22:01 lokiii 阅读(131) 评论(0) 推荐(0) 编辑
摘要: AC自动机比较简单,把询问串做成AC自动机然后模板串边跑变更新即可 SAM是把模板串做成广义SAM,然后每个节点存有几个模板串经过,具体方法是每次更新暴力向上跳直到有时间戳~~我不会证为什么时间复杂度是对的~~,沿途更新个数,查询的时候直接匹配到最后的点然后输出个数即可 cpp include in 阅读全文
posted @ 2018-11-23 19:51 lokiii 阅读(145) 评论(0) 推荐(0) 编辑
摘要: 把模板串建一个广义SAM 然后在线查询,每次在SAM上预处理出一个a[i]表示i位置向前最多能匹配多长的模板串 二分答案L,dp判断,设f[i]为·~i有几个匹配,转移显然是f[i]=max{f[i 1],f[j]+i j(i a[i]=L\ 0.9 阅读全文
posted @ 2018-11-23 18:39 lokiii 阅读(138) 评论(0) 推荐(0) 编辑
摘要: 差分之后用SAM求LCS,然后答案就是LCS+1 cpp include include include using namespace std; const int N=2005; int n,m,s[N],b[N],fa[N],ch[N][205],dis[N],cur=1,con=1,la,f 阅读全文
posted @ 2018-11-23 17:01 lokiii 阅读(157) 评论(0) 推荐(0) 编辑
摘要: 有一个显然的性质就是每个串一定在某个叶子为根的树中是一条直的链 然后因为SAM里是不会有相同状态的,所以以每个叶子为根dfs一遍,并且动态构造SAM(这里的节点u的last指向父亲),最后统计答案就是dis[i] dis[fa[i]]的和 我看别的题解都说和trie有关……然而并没用用到(也可能是用 阅读全文
posted @ 2018-11-23 16:34 lokiii 阅读(130) 评论(0) 推荐(0) 编辑
摘要: SAM里的转台不会有重复串,所以答案就是每个right集合所代表的串个数的和 cpp include include include using namespace std; const int N=100005; int T,n,fa[N],ch[N][27],dis[N],cur=1,con=1 阅读全文
posted @ 2018-11-23 15:59 lokiii 阅读(159) 评论(0) 推荐(0) 编辑
摘要: 多串LCS~~很适合SA但是我要学SAM~~ 对第一个串求SAM,然后把剩下的串在SAM上跑,也就是维护p和len,到一个点,如果有ch[p][c],就p=ch[p][c],len++,否则向fa找最下的有c[p][c]的p,然后len=dis[p]+1,p=ch[p][c],否则就p=root,l 阅读全文
posted @ 2018-11-23 09:39 lokiii 阅读(148) 评论(0) 推荐(0) 编辑
摘要: 先求出SAM,然后考虑定义,点u是一个right集合,代表了长为dis[son]+1~dis[u]的串,然后根据有向边转移是添加一个字符,所以可以根据这个预处理出si[u],表示串u后加字符能有几个本质不同子串 然后回答的时候在树上跑一下即可 阅读全文
posted @ 2018-11-23 07:57 lokiii 阅读(155) 评论(0) 推荐(0) 编辑
摘要: 先求个SAM,然后再每个后缀的对应点上标记si[nw]=1,造好SAM之后用吧parent树建出来把si传上去,然后用si[u]更新f[max(u)],最后用j i的[j]更新f[i] 因为每个点u对应长为min(u)~max(u)的串,我们就把它记在max(u)上,最后再统一向前更新,然后更新后的 阅读全文
posted @ 2018-11-22 16:31 lokiii 阅读(132) 评论(0) 推荐(0) 编辑
摘要: 看上去比较SA,但是在学SAM所以就用SAM来做…… 把串复制一遍接在后面,对这个新串求SAM(这里的儿子节点要用map转移),然后从根节点每次都向最小的转移走,这样走n次转移的串就是答案 阅读全文
posted @ 2018-11-22 14:44 lokiii 阅读(108) 评论(0) 推荐(0) 编辑
摘要: 先加入未出现字符间隔把n个串连起来,注意如果串开的char这个间隔字符不能溢出,把这个接起来的串跑SA,二分答案k,判断的时候把连续一段he =k的分成一组,然后看着一段是否包含了 n/2的串的后缀。 统计是否出现这里可以用时间戳优化visit数组,就不用每次memset了 输出答案的时候和二分判断 阅读全文
posted @ 2018-11-21 10:45 lokiii 阅读(102) 评论(0) 推荐(0) 编辑
摘要: 把两个串中间加一个未出现字符接起来,然后求SA 然后把贡献统计分为两部分,在排序后的后缀里,属于串2的后缀和排在他前面属于串1的后缀的贡献和属于串1的后缀和排在他前面属于串2的后缀的贡献 两部分分别作,都用单调栈维护一段里的height最小值(因为lcp是排序后两后缀中间height最小值),然后根 阅读全文
posted @ 2018-11-21 09:01 lokiii 阅读(100) 评论(0) 推荐(0) 编辑
摘要: 把两个串接到一起求一个SA,然后找最大的sa[i]和sa[i 1]不是一个串的he[i] cpp include include include using namespace std; const int N=500005; int n,m,wa[N],wb[N],wv[N],wsu[N],sa[ 阅读全文
posted @ 2018-11-20 19:20 lokiii 阅读(91) 评论(0) 推荐(0) 编辑
摘要: kmp,根据next数组的性质如果有答案的话就是n/(n (ne[n]+1)),否则是1 搬来打算用SA后来发现必须用DC3就没写 cpp include include include using namespace std; const int N=1000005; int n,ne[N]; c 阅读全文
posted @ 2018-11-20 19:04 lokiii 阅读(120) 评论(0) 推荐(0) 编辑
摘要: 差分,然后二分长度mid,判断是把height按照min不小于mid分组,取最大最小的sa位置看是否 =mid即可,注意差分后最后答案要+1 阅读全文
posted @ 2018-11-20 14:32 lokiii 阅读(85) 评论(0) 推荐(0) 编辑
摘要: 用read()会挂 二分半径,显然最优的是所有原都用这个最小半径,然后2 SAT把相交的圆建图,跑tarjan判一下可行性即可 阅读全文
posted @ 2018-11-20 09:41 lokiii 阅读(203) 评论(0) 推荐(0) 编辑
摘要: 振り返り方、教えて頂戴よ 阅读全文
posted @ 2018-11-19 15:29 lokiii 阅读(138) 评论(0) 推荐(0) 编辑
上一页 1 2 3 4 5 6 7 8 9 10 ··· 29 下一页