SA
alan_cty
蒟蒻一只
别打脸(⊙o⊙)哦
展开
-
SA模板
sa模板(pascal倍增)for i:=1 to n do begin s[i]:=t[i];x[i]:=ord(s[i]); if x[i]>max then max:=x[i]; inc(ws[x[i]]); end; for i:=1 to max do inc(ws[i],ws[i-1]); for i:=n原创 2016-03-25 21:38:11 · 927 阅读 · 0 评论 -
SA模板
sa模板(c++倍增)void tsort() { memset(ws,0,sizeof(ws));int mx=0; fo(i,1,n) ws[x[y[i]]]++,mx=max(mx,x[y[i]]); fo(i,1,mx) ws[i]+=ws[i-1]; fd(i,n,1) sa[ws[x[y[i]]]]=y[i],ws[x[y[i]]]--;}void g原创 2016-04-15 20:04:21 · 1552 阅读 · 0 评论 -
文件修复
Description给出一个字符串S,求S有多少个出现了2次以上的字串。 |S|<=100000Solutioin又是裸题,求出SA用单调栈直接搞就好了。 用来复习SACode#include<cstdio>#include<cstring>#include<algorithm>#define fo(i,a,b) for(int i=a;i<=b;i++)#define fd(i,a,原创 2016-04-20 19:42:48 · 505 阅读 · 0 评论 -
【GDOI2017模拟9.10】子串
Description给出n个字符串Si,m次询问,第i次询问Sli~Sri这些字符串中有多少个是字符串pi的母串。 ∑|Si|,∑|pi|<=5∗105\sum{|Si|},\sum{|pi|}<=5*10^5Solution看到多串匹配就想到了AC自动机。 然而辛辛苦苦打完之后发现只有自己傻傻地写的那么辣鸡。 在线OrzSAM和SA分块做法。显然我们需要离线回答。 把所有的pi建一棵AC原创 2016-09-10 16:51:25 · 682 阅读 · 0 评论 -
【GDOI2017模拟8.12】字符串
Description给出一个长度为n的字符串,求所有连续重复子串中最大的重复次数。 n<=50000 数据组数<=20Solution这种题第一眼就应该想到SA。。。 然而SA并不是主要算法。一会再说。 我们枚举重复子串的长度l。那么很显然,这个子串会包含S[0],S[l],S[2l]…中的至少一个点。 我们枚举开头i=0,l,2l,3l…. 然后求出k=lcp(i,i+l)。 这里的原创 2016-08-13 16:56:39 · 507 阅读 · 0 评论 -
【NOI2017模拟3.25】历史行程
Description给出一个长度为n的字符串,m次询问前缀l~r中两两的最长后缀最长是多少。 n,m<=1e5Solution显然先倒过来,询问变成求后缀的lcp SA处理一下就好了。 但是rank不是有序的,无法处理,怎么办呢? 可以离线莫队,维护一个set,每次插入或删除都可以log n解决。 但是复杂度过高会T怎么办呢? 我们每次插入就是要求某个点的前继和后继。 这个东西可以用原创 2017-03-29 20:55:32 · 537 阅读 · 0 评论 -
[codeforces 547 E][51nod1440]迈克打电话
Description给出n个字符串,这n个字符串的总长为L,定义函数call(i,j)表示第j个字符串在第i个字符串中出现的次数。 给出q次询问,每次询问给出l,r,k,求∑ri=lcall(i,k)\sum_{i=l}^{r}call(i,k) n,l<=2*1e5,q<=5*1e5Solution蒟蒻不会fail树做法QwQ 只会最朴素的SA啊_ (:з」∠) _ 首先把所有串接在一起原创 2017-10-14 10:11:23 · 475 阅读 · 0 评论 -
【NOI2019五校联考2019.3.5】Second
Description给出一个长度为n的字符串S,你需要对k1~kn赋值,满足∑ki=1,使得max(kj*lcp(s[i…n],s[j…n])最小,求出这个最小值|S|<=10^6Solution比赛时一直在想怎么解方程真是菜坏了先把后缀树弄出来,显然有祖先后代关系的两点不会同时有值设F[x]表示x为根,内部已经分好权值和为1的最小值。考虑从儿子怎么转移,设儿子的F值分别为f...原创 2019-03-05 15:48:03 · 414 阅读 · 0 评论