hdu3518 字尾陣列的height應用

2021-07-05 01:08:26 字數 734 閱讀 6669

height[i] 表示 排第i的子串和第i-1的子串的最長公共字首,對於某乙個長度k,如果存在連續一段height值大於等於k且起始位置的最遠距離大於等於k,這一段就存在乙個解,ans加1

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

#define rep(i,n) for(int i=0;i=0;i--) sa[--cnt[f[i]]]=i;

int d=1,p=0;

while(d=d) sr[p++]=sa[i]-d;

rep(i,up) cnt[i]=0;

rep(i,len) cnt[f[sr[i]]]++;

repp(i,1,up) cnt[i]+=cnt[i-1];

for(int i=len-1;i>=0;i--) sa[--cnt[f[sr[i]]]]=sr[i];

swap(f,r);

p=0;

f[sa[0]]=p++;

rep(i,len-1)

f[sa[i+1]]=(sa[i]+d=x) ans++;

l=1e9;r=0;

}else

}if(r-l>=x) ans++;

return ans;

}int main()

return 0;

}

hdu 3518 字尾陣列

晚飯前寫的 一直wa,一直想不通,後來寫程式對拍了,一百組資料中錯了一組,然後還是想不通為什麼的,然後的然後看了別人的 然後瞬間知道自己為什麼wa!還是對字尾陣列了解的不夠,自己預設的是sa中排在前面的然後在字串陣列中下標也是在前面的,然後就沒有挨個比較相同長度中的取最大值和最小值,所以wa的可憐啊...

hdu 3518 字尾陣列

字尾陣列的題目主要是對三個陣列的利用 sa 記錄的是排名為i的字尾的首字母的下標 1 n rank 記錄的是首字母下標為i的字尾的排名 n height 記錄是j和j 1排序的最長公共字首 這道題求取的是不重疊的最少出現兩次的子串的個數 根據height j 陣列的性質,列舉長度然後按順序遍歷i,如...

字尾陣列 HDU 4436

做法 首先應用求不同子串的演算法,自然想到字尾陣列,然後就是要統計以非 0 開始的字尾。考慮字尾 akak 1ak 2.an tmp 0 ak 0 tmp i tmp i 1 10 ai 0 sum i sum i 1 tmp i 那麼 以 am開始的字首和就是 sum n sum m 1 tmp ...