bzoj2754 喵星球上的點名 字尾陣列

2021-07-09 21:46:48 字數 1074 閱讀 1039

好久不寫字尾樹組了(好像以前也就寫過一遍吧),各種奇葩出錯。

實際上即使是字尾樹組時間複雜度也是不對的。。為o(m*len)。另外ac自動機也可做,時間複雜度還是不對。。(可能可以用樹上的一些結構來統計保證時間複雜度,但具體沒有想過)。

首先將姓名和點名串用間隔符連起來跑字尾樹組(sam應該也行,但是後面完全不一樣)。把點名串也加進去的話方便找到點名串的位置。找到點名串的位置以後只要height值》點名串的長度就可以不斷向前後拓展,然後更新答案。

ac**如下:

#include#include#include#define n 300005

using namespace std;

int n,m,cnt,mx,sa[n],hgt[n],rnk[n],t[n],sum[n*4],blg[n],a[n],sta[n],val[n],l[n],ans[n];

int read()

return x;

}void getsa()

for (k=1; nowk; i--) t[sum[rnk[i]]--]=i-k;

for (i=1; i<=n; i++) sum[i]=0;

for (i=1; i<=n; i++) sum[rnk[i]]++;

for (i=2; i<=n; i++) sum[i]+=sum[i-1];

for (i=n; i; i--) sa[sum[rnk[t[i]]]--]=t[i];

now=0; memcpy(t,rnk,sizeof(rnk));

for (i=1; i<=n; i++) }}

void gethgt()

for (j=sa[rnk[i]-1]; a[i+k]==a[j+k]; k++); hgt[rnk[i]]=k; }}

int solve(int k,int x)

int main()

a[++n]=++mx;

} for (i=1; i<=m; i++)

getsa(); gethgt();

for (i=1; i<=m; i++)

for (i=1; iby lych

2016.2.11

BZOJ 2754 喵星球上的點名(字尾陣列)

題意 給出n個字典串,m個詢問串。輸出每個詢問串出現在多少個字典串中。最後輸出每個字典串中含有多少個詢問串。思路 將所有字典串和所有詢問串連在一起求sa和h陣列。統計時對於每個詢問串,設長度為len,向前向後掃一下h值大於等於len的區間。然後在這個區間中看有多少個字典串,就是這個詢問串的答案,同時...

喵星球上的點名

a180285幸運地被選做了地球到喵星球的留學生。他發現喵星人在上課前的點名現象非常有趣。假設課堂上有n個喵星人,每個喵星人的名字由姓和名構成。喵星球上的老師會選擇m個串來點名,每次讀出乙個串的時候,如果這個串是乙個喵星人的姓或名的子串,那麼這個喵星人就必須答到。然而,由於喵星人的字碼過於古怪,以至...

SCOI2012 喵星球上的點名

有n個串,代表n個人的姓氏和名字,都是用很多個數字表示的,比如我姓1,2,3,4,名4,5,6,7。然後有m個點名串,如果點到了某個人的姓或名裡面的某一串,那個人就被點到,不過乙個人在乙個點名串中只能被點一次。比如點名串是2,3,4,我的姓中含有2,3,4,那麼我就會被叫到。求每個學生分別被叫到多少...