題意
給出n個字串,問每個字串中有多少子串是這所有的n個字串中至少k個的子串。
分析廣義字尾自動機模板題。對這n個串建廣義字尾自動機,對於每個狀態維護兩個值cou[u]和lcu[u]分別代表擁有這個狀態的子串的數量和上一次更新到這個狀態的子串的數量。然後設f[u]為狀態u到祖先的所有結點有多少子串出現在至少k個字串中。然後再跑一邊每個子串就可以了。
1 #include 2 #include 3 #include 4 #include 5view code6using
namespace
std;
7const
int maxn=1e5+100
;8 typedef long
long
ll;9
string
s[maxn];
10char
s[maxn];
11struct
statest[2*maxn];
15int
n,k,last,cur,sz;
16int c[2*maxn];
17int cou[2*maxn],lcu[2*maxn];//
不同子串數量,上一次出現的子串
18ll f[maxn];
1920
void
init()
26void build_sam(int
c)48
}49 last=cur;50}
51int cmp(int a,int
b)54
55int
main()
66for(int i=1;i<=n;i++)74}
75for(int i=0;i)
76 c[i]=i;
77 sort(c,c+sz,cmp);
78for(int i=0;i)85}
86}87for(int i=1;i<=n;i++)
95 printf("
%lld\n
",res);96}
9798
return0;
99 }
bzoj 3277 串 (廣義字尾自動機)
time limit 10 sec memory limit 128 mb submit 357 solved 144 submit status discuss 字串是oi界常考的問題。現在給定你n個字串,詢問每個字串有多少子串 不包括空串 是所有n個字串中至少k個字串的子串 注意包括本身 第一行...
BZOJ 3277 串 廣義字尾自動機
判斷乙個串是否在至少k個字串裡面的方法後3473一樣,每新增乙個新的字元就沿fail鏈更新。剩下的問題就只是剩下了,每增加乙個新的字元,共多出現了多少個新的字串,如果不要求重複,那麼很顯然就是len u len fail u 這裡重複的字串也需要加入答案所以只用沿fail鏈dfs一下,sum u f...
bzoj3277 串 廣義字尾自動機
廣義字尾自動機板子題 廣義字尾自動機的建圖方法大概就是在trie上按bfs序來建圖,這裡的last節點應該是trie上父親的last節點 然後這裡按題目要求記right為在至少k個串走過的方案,具體建法就是先把每個串跑一遍然後在parent樹上更新所有父親節點的答案,注意不要判重。然後掃一遍所有節點...