HDU 4622(字尾自動機)

2021-08-27 23:42:36 字數 1311 閱讀 2713

czh得意的向cry炫耀自己的英文水平,cry很不屑的扔給czh一篇文章,雖然czh看完之後頭暈眼花,但他還是決定猜測一下文章中單詞的意思,由於文章連空格都沒有,這大大增加了閱讀的難度,於是他決定退而求其次,只需要計算一下從第l個字元到第r個字元中有多少個可能的互不相同單詞(任意長度 >=1 ,任意組合的字元都是乙個可能的單詞)就行了,這時候就需要聰明的你們來幫忙了。

input

第一行讀入t,表示資料組數(t<=5) 

對於每組資料,第一行讀入字串s len[s]<2000 為cry給出的文章 

第二行乙個正整數q(q<=10000)表示提問次數 

接下來q行,每行兩個正整數l,r

output

對於每次提問,每行輸出乙個答案

sample input

2

cchch

31 4

2 53 4

hzzhz

45 5

3 51 4

3 3

sample output

873

1581

給你乙個字串,給你q個詢問,問你在字串區間[l,r]中有多少個本質不同的字串。

字尾自動機模板題呀。

個人理解字尾自動機就是將一顆字尾樹的空間不斷壓縮而形成的一張有向圖。而建立出來的字尾自動機中的從root開始走的到結尾的所有不同的路徑均代表著一種本質不同的字串。其中有兩個很重要的數字,其中l[i]代表了從root走到第i個結點的距離,而fa指標則代表著第i個結點的字尾連線(即fa[i]是i的字尾)

而在我們加入每乙個字元的過程中,加入該字元所增加的路徑為

而對於這個題,因為詢問比較大(1e4)但字串str長度較小(1e2),因此我們可以考慮用字尾自動機預處理出來字串str的所有位置的字串的個數,之後o1查詢即可。

#include #define maxn 2005

using namespace std;

char str[maxn];

int len;

int ans[maxn][maxn];

struct sam

void init()

int insert(int c)

}tot+=l[last]-l[fa[last]];

return tot;

}}sam;

int main()

}int m;

scanf("%d",&m);

while(m--)

}return 0;

}

HDU4622 字尾自動機

題目 reincarnation 題意 給定乙個字串,然後再給定q個詢問,每個詢問是乙個區間 l,r 問在這個字串區間中有多少個不同的子串。字尾自動機模版題 include include include include using namespace std const int n 5010 st...

字尾陣列 lcp st表 hdu4622

hdu4622 字尾陣列基礎題?昨天學了字尾排序其實最有用的是字尾陣列求lcp lcplc p?用了乙個hei ght i l cp s a i sa i 1 height i lcp sa i sa i 1 height i lcp sa i sa i 1 也就是排名為i ii的和排名i 1 i ...

字尾自動機

基礎知識 step i 表示的是字串i在原字串中的位置。pareint i 表示root到parent i 的子串是root到i的最長字尾。字尾自動機遍歷可以得到原字串的所有子串。特殊技巧 一 字尾自動機的不同子串數有兩種求法 1.ans step i step parent i 1 i cnt 2...