題意:
有n個字串,詢問找出乙個最長的子串在一半以上的字串**現過,若沒有,則輸出-1
題解:把每個字串鏈結在一起,中間加上分隔符,計算出h陣列,利用h陣列將字尾分組的性質,我們就可以二分長度,然後再判斷每一組的字首是否出現過一半以上即可。
ac**:
#include
#include
#include
using
namespace std;
const
int maxn =
1e6+
200;
const
int maxm =
105;
char a[maxn]
;int s[maxn]
;int rk[maxn]
,y[maxn]
,c[maxn]
,sa[maxn]
,h[maxn]
;int vis[maxm]
,ans[maxn]
,len[maxm]
;inline
voidsa(
int n,
int m)
}inline
voidh(
int n)
}inline
bool
check
(int mid,
int n,
int k)
}else}if
(cnt>k/
2) ans[
++sz]
=sa[n];if
(sz)
return
false;}
intmain()
s[n-1]
=0;sa
(n,255);
h(n-1)
;int l=
1,r=n;
while
(l<=r)
if(l==1)
puts
("?");
else
}puts(""
);}return0;
}
poj 3294 字尾陣列
題意 給定n個串,求最長的子串s,使得s為其中超過一半的串的公共子串。題解 字尾陣列,按height陣列分組,按sa陣列輸出。include include include using namespace std const int maxn 200000 int s maxn w maxn wa ...
poj3294 字尾陣列emmm
tle一下午,memset不能用太多,吧memset的陣列大小設定成正好,別設定太大 include include include include include include include include include include includeusing namespace std ...
POJ 3294 Life Forms(字尾陣列)
解題思路 求出所有 最長的 出現在超過一半所給字串的 子串。這題是在錯自閉了可以去poj discuss裡面,有本題資料的。反正我是瘋狂ole,re了一晚上。最後發現ole是 寫錯導致輸出的串的數量不對 其實也就是wa 所以導致debug的方向就出錯了。做法是二分答案,判斷是否可行,可行就記錄當前所...