Life Forms 字尾陣列

2021-10-04 09:26:31 字數 1145 閱讀 2879

就是用字尾陣列加二分,這裡要把每乙個子串連成乙個串,每乙個串用乙個不可能出現的字元,例如#,*之類的分開,然後對連城的字串做字尾陣列,再二分一下最長公共串長度就可以了。

#include

#include

#include

#include

#include

using

namespace std;

const

int n=

1000010

;int s[n]

;int c[n]

,x[n]

,y[n]

,n,m,height[n]

,rk[n]

,sa[n]

;void

suffix()

}void

getheight()

}}char str[

4010];

int vis[n]

,mp[n]

;int t;

//mp記錄每乙個子串的位置

int mar[n]

;vector<

int>ans[

1010];

intcheck

(int x)

i++;}

if(!vis[mp[sa[i-1]

]])if

(cnt>t/2)

//最後我們還要看一下有沒有符合要求}if

(ans[x]

.size()

!=0)return1;

return0;

}int

main()

s[n++]=

'#'+i;

} s[n++]=

0;m=

150;

suffix()

;getheight()

;int l=

1,r=

1000

,mid,len=0;

while

(l<=r)

else

r=mid-1;

}if(len==0)

printf

("?\n");

else}}

return0;

}

POJ 3294 Life Forms(字尾陣列)

解題思路 求出所有 最長的 出現在超過一半所給字串的 子串。這題是在錯自閉了可以去poj discuss裡面,有本題資料的。反正我是瘋狂ole,re了一晚上。最後發現ole是 寫錯導致輸出的串的數量不對 其實也就是wa 所以導致debug的方向就出錯了。做法是二分答案,判斷是否可行,可行就記錄當前所...

POJ 3294 Life Forms(字尾陣列)

題意 有n個字串,詢問找出乙個最長的子串在一半以上的字串 現過,若沒有,則輸出 1 題解 把每個字串鏈結在一起,中間加上分隔符,計算出h陣列,利用h陣列將字尾分組的性質,我們就可以二分長度,然後再判斷每一組的字首是否出現過一半以上即可。ac include include include using...

POJ 3294 Life Forms 字尾陣列

多個串中,出現次數為k次的最長公共子串的個數,並且輸出。一般的演算法就是字尾陣列加二分,複雜度o n logn 其實也可以和poj3415一樣維護乙個棧,思想都是差不多的,維護乙個單調遞增的棧,每到乙個height i 時,先保證棧單調遞增並且統計個數sum,然後height i 再與當前最優值比較...