失戀的小 T(字尾陣列)

2021-07-31 12:19:33 字數 2012 閱讀 3034

時間限制: 1 sec  

記憶體限制: 128 mb

提交: 174  

解決: 75 [

提交][

狀態][

討論版]

小 t 最近失戀了,開始懷疑人生和愛情,他想知道在這世界中去偽存真後還剩多少。 

小 t 在網上拿到了代表大千世界的長字串,刪掉了所有換行空格和標點符號,只剩下了小寫字母。 

現在字串中有好多重複的子串,相同子串裡只有乙個是 real 的。 

為了讓小 t 走出失戀,你一定要告訴他這個世界上 real 的東西有多少。 

(子串:串中任意個連續的字元組成的子串行稱為該串的子串) 

包含 100 組輸入,每組為一行字串,只包含小寫字母,長度 1-5000。 

輸出 100 行,每行乙個整數,對應輸入的答案。 

aaba

8

[

提交][

狀態]題意簡化後是:給你乙個字串,問這個字串有多少個不同的字串,這道題第一眼看暴力可做,雜湊可做,字典樹可做,所以很容易馬上試一發,但是仔細算算複雜度和記憶體是過不了的。 首先想到的是字典樹,把所有的字串插入到字典樹中,最後輸出一共有多少樹的節點即可,但是這樣會超記憶體。然後想到了字典樹的左兒子右兄弟表示法,可以節省記憶體,然而這樣每次查詢兒子的時候需要遍歷一遍兒子鍊錶,導致 tle。 然後想到了雜湊,這樣就不會超時了,求出雜湊表來之後,只有 n2 的複雜度,然而這樣塞進乙個 set 裡面也會超時。於是想到了先放進 vector 再排序去重,可以減少一定時間,然而這樣 vector 就存不下了,mle。 直到最後才想到了字尾陣列,知道了字尾串字典序排序,求出 height 陣列來之後,就可以知道每個字尾與前乙個字尾的最長公共字首。這樣最後統計求和一下就可以了。需要注意劉汝佳的模板使用的時候字串後面需要補』 $』 字尾陣列也算是字串處理中的神器了,經常和 rmq 結合使用,建議大家學會。

應該算是比較裸的字尾陣列的題目,子串就是所有字尾的所有字首,基於這個思想,考慮字尾陣列得height陣列,每兩個排名相鄰得字尾得最長公共字首,兩個字尾得差就是中間得一段字串咯,他出現過的話,個數就是公共字首長度,比如aabab,ab和abab兩個字尾,公共部分是ab,代表子串ab和a是重複的,最後得ans就是所有子串-height裡面得和。(如果是ababab那麼ababab和abab和ab說白了就是a ab aba abab前兩個字尾得字首夠出得子串中這四個是重複的,ab和abab是a ab是重複的,用不用算ababab和ab呢,不用,因為已經剪掉了後面出現得,不能減兩次甚至更多)

#include#include#include#include #include#include#include#include#include#include#include#includeusing namespace std;

#define maxn 200100

#define maxm 200005

#define rd(x) scanf("%d", &x)

#define rd2(x, y) scanf("%d%d", &x, &y)

#define mod 1000000007

const int maxn = 20010;

int t1[maxn],t2[maxn],c[maxn];

bool cmp(int *r, int a,int b,int l)

void da(int str, int sa, int rankk, int height, int n, int m)

int k =0;

n--;

for(i = 0; i <= n;i++) rankk[sa[i]] = i;

for(i = 0; i < n;i++)

}int rankk[maxn],height[maxn];

char str[maxn];

int r[maxn],sa[maxn];

int main()

printf("%lld\n", res);

}return 0;

}

1009 失戀的小 T(字尾陣列 )

時間限制 1 sec 記憶體限制 128 mb 提交 160 解決 76 提交 狀態 討論版 小 t 最近失戀了,開始懷疑人生和愛情,他想知道在這世界中去偽存真後還剩多少。小 t 在網上拿到了代表大千世界的長字串,刪掉了所有換行空格和標點符號,只剩下了小寫字母。現在字串中有好多重複的子串,相同子串裡...

弱校聯盟con 7 失戀得小T(字尾陣列)

小 t 最近失戀了,開始懷疑人生和愛情,他想知道在這世界中去偽存真後還剩多少。小 t 在網上拿到了代表大千世界的長字串,刪掉了所有換行空格和標點符號,只剩下了小寫字母。現在字串中有好多重複的子串,相同子串裡只有乙個是 real 的。為了讓小 t 走出失戀,你一定要告訴他這個世界上 real 的東西有...

字尾陣列模板 LCP小證明

複習了一遍字尾陣列 關於lcp的證明 簡單的說下 設p min height k ilcp i,j p,顯然lcp i,j p 排名越相近,字首越可能相同 假設lcp i,j tp。則字串sa i 和字串sa j 前tp位相同。從sa i 到sa j 之間的字串一定是從sa i 到sa j 字典序遞...