POJ 3294 不小於k個字串中的最長子串

2021-08-26 23:35:43 字數 1237 閱讀 3328

將n個字串連線起來,中間用沒有出現過的字元隔開,然後求字尾陣列,二分答案,進行分組,判斷每組的字尾是否出現在不小於k的原串中。

#include#include#includeconst int maxn = 1e5+1e3;

int r[maxn]; // r 陣列儲存了字串中的每個元素值,除最後乙個元素外,每個元素的值在 1..m 之間,最後乙個元素的值為 0

int wa[maxn], wb[maxn], wv[maxn], ws[maxn]; // 這 4 個陣列是字尾陣列計算時的臨時變數,無實際意義

int sa[maxn]; // sa[i] 儲存第 i 小的字尾在字串中的開始下標,i 取值範圍為 0..n-1

int cmp(int *r, int a, int b, int l)

void da(int *r, int *sa, int n, int m)

return;

}int rank[maxn]; // rank[i] 表示從下標 i 開始的字尾的排名,值為 1..n

int height[maxn]; // 下標範圍為 1..n,height[1] = 0

void calheight(int *r, int *sa, int n)

int tmp[maxn],pos[maxn],len; //tmp儲存分割字元的下標。pos儲存答案開始字元的下標,len是tmp陣列的長度

bool vis[110];

char s[maxn];

bool check(int mid,int n,int k)

if(!vis[tmp[sa[i-1]]])

}else

}if(ans>k/2) pos[++num]=sa[n];

if(num)

return false;

}int main()

tmp[n]=128+i;

r[n++]=128+i; //保證每個分隔符都不同

}r[n]=0;

da(r,sa,n+1,240);

calheight(r,sa,n);

int l=1,r=n,ans=0;

while(l<=r)else r=mid-1;

}if(icase++) puts("");

if(!ans) puts("?");

else}}

return 0;

}

POJ 3415 不小於k的公共子串的個數

common substrings time limit 5000ms memory limit 65536k total submissions 9248 accepted 3071 description a substring of a string t is defined as t i,k...

左旋字串k個字元

常用方法左旋字串 include include include pragma warning disable 4996 void left move char str,int len,int steps str i 1 tmp int main 為了使程式簡便,將字串進行拷貝並與字串相連線,組成乙...

字串左旋k個字元

解決這個問題,有兩種解題思路,首先來說第一種思路,先定義乙個指標指向字串的首位址,再用tmp 儲存首元素,依次把元素往前移,最後把tmp裡的值放在空出來的位置,迴圈k次就實現了左旋k個字元 第二種思路,把字串分成兩部分,先逆置前一部分,再逆置剩下的部分,最後整體逆置,也可實現左旋k個字元。左旋k個字...