解題思路:
求出所有 最長的 出現在超過一半所給字串的 子串。
這題是在錯自閉了可以去poj discuss裡面,有本題資料的。
反正我是瘋狂ole,re了一晚上。
最後發現ole是**寫錯導致輸出的串的數量不對(其實也就是wa),所以導致debug的方向就出錯了。
做法是二分答案,判斷是否可行,可行就記錄當前所有可行的起點。
判斷方法就是把height按照》=k分成一組組,每一組內部看是否屬於至少有超過一半的字串有這個部分。
二分最後得到乙個答案以及一堆起點,由於需要按照字典序輸出。
所以扔進set排個序再扔出來。
**:
#include#include#include#include#include#include#includeusing namespace std;
#define ll long long
#define for1(i,a,b) for (int i=a;i<=b;i++)
#define for0(i,a,b) for (int i=a;isss;
void buildsa(int n,int m)
}if (cnt>=need && flag)
cnt = 0;
memset(vis,false,sizeof vis);
i = j;}}
return flag;
}int main()
if (r==0)
else }}
return 0;
}
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(字尾陣列)
題意 有n個字串,詢問找出乙個最長的子串在一半以上的字串 現過,若沒有,則輸出 1 題解 把每個字串鏈結在一起,中間加上分隔符,計算出h陣列,利用h陣列將字尾分組的性質,我們就可以二分長度,然後再判斷每一組的字首是否出現過一半以上即可。ac include include include using...