就是用字尾陣列加二分,這裡要把每乙個子串連成乙個串,每乙個串用乙個不可能出現的字元,例如#,*之類的分開,然後對連城的字串做字尾陣列,再二分一下最長公共串長度就可以了。
#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 再與當前最優值比較...