思路:
寫得我頭腦發蒙,,, 旁邊還有倆唱歌的 抓狂
(感謝lh大爺查錯)
首先 1、w是s1的子串
2、w是s2的子串
這兩步很好辦啊~ 字尾陣列一下o(n)就可以搞
重點是 這個:3、s3不是w的子串
怎麼辦呢
把 1、3做一發kmp
那麼取一下min就好了
注意重疊的情況
(其實是可以o(n)搞的 我一開始寫錯了 改的時候偷懶就直接二分了)
也很快~
//by siriusren
#include
#include
#include
using
namespace
std;
const
int n=100050;
int len1,len2,len3,n,cnta[n],cntb[n],a[n],b[n],sa[n],tsa[n],rk[n],ht[n],next[n],rec[n],ans;
char s[n],s1[n],s2[n],s3[n];
void sa()
for(int i=1,j=0;i<=n;i++)
}void get_next()
}void kmp()
}}int main()
printf("%d\n",ans);
}
poj2406 kmp,字尾陣列
開始是用字尾陣列做的,rmq果斷超了記憶體,全部改用unsigned short結果又超時,後來參考了 裡的方法。關鍵思想是設k為最小重複字串的長度,則s 0,1 n k 1 s k,k 1 n 1 即lcp rank 0 rank k n k 由於0位置是固定的,只需要對名次迴圈求出最小的k就行!...
POJ 3080 字尾陣列 KMP
題意 給定n個dna串,求最長公共子串。如果最長公共子串的長度小於3時輸出no significant commonalities,否則輸出該子串,如有多解請輸出字典序最小的解 思路 是poj 3405的弱化版。思路請參考 define crt secure no deprecate include...
bzoj 1692 字尾陣列
將乙個字串進行如下操作 每次拿去首或尾,放在新字串尾,問新字串字典序最小的情況。直覺貪心,但情況複雜。可以用字尾陣列,每次比較當前剩餘串正序和倒序哪種字典序小,可以如下構建 abcd abcd0dcba include include include include include include ...