hdu 3518 字尾陣列

2021-06-18 15:14:16 字數 729 閱讀 6502

晚飯前寫的**,一直wa,一直想不通,後來寫程式對拍了,一百組資料中錯了一組,然後還是想不通為什麼的,然後的然後看了別人的**,然後瞬間知道自己為什麼wa!還是對字尾陣列了解的不夠,自己預設的是sa中排在前面的然後在字串陣列中下標也是在前面的,然後就沒有挨個比較相同長度中的取最大值和最小值,所以wa的可憐啊,不過在比賽前又找到自己的乙個缺陷好高興啊,說明以後做這類題ac率又提高了,哈哈!

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

#define rep(i,n) for(int i=0; i=(m); --i)

#define ll long long

#define arc(a) ((a)*(a))

#define inf 100000

#define exp 0.000001

#define n 3005

char s[n];

int n;

int sa[n*2],high[n*2],rank[n*2],tmp[n*2],top[n*2];

void makesa()

}void lcp()

void solve()

else

}if(l!=1200 && r!=-1) if(r-l>=i) ans++;

} cout<

hdu 3518 字尾陣列

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

hdu3518 字尾陣列的height應用

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

字尾陣列 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 ...