poj3294 字尾陣列emmm

2021-09-19 20:49:28 字數 1297 閱讀 2385

tle一下午,memset不能用太多,吧memset的陣列大小設定成正好,別設定太大

#include#include#include#include#include#include#include#include#include#include#includeusing namespace std;

#define ll long long

int n,m,kk;

const int ding=1e5+100;

const int inf=0x3f3f3f3f;

int sa[ding],x[ding],y[ding],c[ding],r[ding],strlenn[ding],rankk[ding],height[ding],flag=0,vis[1200],ans[ding];

int cas=1;

string str;

void get_sa()

int p=1;

for(k=1;k=k) y[p++]=sa[i]-k;//大於等於k

//sa是第一關鍵字的排名, 然後再根據第二關鍵字的排名來確定排名,

memset(c,0,sizeof(c));

for(i=0;i=0;i--) sa[--c[x[y[i]]]]=y[i]; //重置sa陣列

memcpy(y,x,sizeof(x));

memset(x,0,sizeof(x));

// swap(x,y);

p=1;//從1開始編號

x[sa[0]]=0;

//因為上面已經重置了x的值 所以下面是從1開始迴圈,然後是和前乙個比較sa[i]和sa[i-1] 比較

for(i=1;i=n)break;

}// for(i=0;i=mid)

r[n++]=299-j;

}// cout

// cout<<"strlenn "

get_sa();

get_height();

l=1;r=1100;

cnt=0;

while(l<=r)

else r=mid-1;

} if(cas!=1)cout

// cout

cout

}} 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 ...

POJ 3294 Life Forms(字尾陣列)

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

POJ 3294 Life Forms(字尾陣列)

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