題目還是自己找吧,我有點懶啦。
今天我寫一下字尾陣列的部落格,php的更新鮮停一天。
給定乙個字串,求最長重複子串,這兩個子串不能重疊。
演算法分析:
先二分答案,把題目變成判定性問題:判斷是否存在兩個長度為k的子串是相同的,且不重疊。解決這個問題的關鍵還是利用height陣列。把排序後的字尾分成若干組,其中每組的字尾之間的height值都不小於k。例如,字串為「aabaaaab」,當k=2時,字尾分成了4組,如圖5所示。思路是這樣的啦,**嘿嘿嘿。。容易看出,有希望成為最長公共字首不小於k的兩個字尾一定在同一組。然後對於每組字尾,只須判斷每個字尾的sa值的最大值和最小值之差是否不小於k。如果有一組滿足,則說明存在,否則不存在。整個做法的時間複雜度為o(nlogn)。
#include
#include
#include
#include
#include
#include
using
namespace
std;
int a[210000],wr[210000],mc[210000],js[210000],sa[210000],y[210000],height[210000];
bool cmp(int k1,int k2,int ln)
void get_sa(int n,int m)
//得到新的mc陣列
m=p;ln*=2;
}a[0]=0;sa[0]=0;
}void get_he(int n)
}bool check(int n,int k)
}return
false;
}void erfen(int n)
else r=mid-1;
}if(ans>=4)printf("%d\n",ans+1);
else
printf("0\n");
}int main()
get_sa(n-1,200);
get_he(n-1);
erfen(n-1);
}return
0;}
字尾陣列(不可重疊最長重複子串)
poj 1743 二分答案,把題目變成判定性問題 判斷是否 存在兩個長度為k的子串是相同的,且不重疊。解決這個問題的關鍵還是利用 height陣列。把排序後的字尾分成若干組,其中每組的字尾之間的height值都 不小於k。有希望成為最長公共字首不小於k的兩個字尾一定在同一組。然 後對於每組字尾,只須...
字尾陣列練習1 不可重疊最長重複子串
這道題在之前,一定要先看一下我之前在字尾陣列部落格裡面提到的最長公共字首 poj1743 時間限制 2 sec 記憶體限制 128 mb 提交 207 解決 81 提交 狀態 討論版 命題人 admin 題目描述 然後如果你了解了最長公共字首,那麼我們就提一下這道題和最長公共字首有什麼大關係 求字串...
字尾陣列求不可重疊最長重複子串 POJ 1743
不可重疊最長重複子串 pku1743 給定乙個字串,求最長重複子串,這兩個子串不能重疊。演算法分析 這題比上一題稍複雜一點。先二分答案,把題目變成判定性問題 判斷是否存在兩個長度為k 的子串是相同的,且不重疊。解決這個問題的關鍵還是利用height 陣列。把排序後的字尾分成若干組,其中每組的字尾之間...