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 ...