好久不寫字尾樹組了(好像以前也就寫過一遍吧),各種奇葩出錯。
實際上即使是字尾樹組時間複雜度也是不對的。。為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,那麼我就會被叫到。求每個學生分別被叫到多少...