晚飯前寫的**,一直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 ...