2.2.2子串的個數
例5:不相同的子串的個數(spoj694,spoj705)
給定一個字符串,求不相同的子串的個數。
算法分析:
每個子串一定是某個后綴的前綴,那么原問題等價于求所有后綴之間的不相
同的前綴的個數。如果所有的后綴按照suffix(sa[1]), suffix(sa[2]),
suffix(sa[3]), …… ,suffix(sa[n])的順序計算,
不難發現,對于每一次新加
進來的后綴suffix(sa[k]),它將產生n-sa[k]+1 個新的前綴。但是其中有
height[k]個是和前面的字符串的前綴是相同的。所以suffix(sa[k])將“貢獻”
出n-sa[k]+1- height[k]個不同的子串。累加后便是原問題的答案。這個做法
的時間復雜度為O(n)。
看的時候怎么都沒看懂為什么要加一,從他論文里給出的模板來看,sa[i]的取值應該從0 to n-1,帶了一下1111這個數據,顯然加一是錯誤的。后來用模板做了下spoj 694,加1WA,反之AC,證明了我的想法,看來羅同學的表達有些前后不一致了。
另外,羅同學在給出的標程中并沒有使用他給出的解法,而是轉了個彎,等差數列求和算出所有后綴長度的總和,然后在減去height[i](i from 1 to n),
這個做法比直接累加要好些。