hdu 3518 字尾陣列

2021-06-28 22:59:27 字數 750 閱讀 6093

字尾陣列的題目主要是對三個陣列的利用

sa:記錄的是排名為i的字尾的首字母的下標(1 -  n)

rank:記錄的是首字母下標為i的字尾的排名(1-n )

height : 記錄是j和j-1排序的最長公共字首

這道題求取的是不重疊的最少出現兩次的子串的個數

根據height[j]陣列的性質,列舉長度然後按順序遍歷i,如果最長公共字首大於列舉出的長度i,證明存在相同長度為i的不同子串,然後判斷是否重疊即可,因為如果中間只要出現height[j]

#include #include #include #include #define max 1007

using namespace std;

char s[max];

int r[max],sa[max],wa[max],wb[max],wv[max],wss[max],rank[max],height[max];

int cmp ( int *r , int a , int b , int len )

void da ( int* r , int* sa , int n , int m )

}void calheight ( int *r , int *sa , int n )

int main ( )

else

}if ( maxn - minn >= i ) ans++;

}printf ( "%d\n" , ans );

}}

hdu 3518 字尾陣列

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

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