相似的字串(hash 二分)

2022-06-01 01:06:09 字數 970 閱讀 2403

題意:\(給定長為n的字串s,要取出k個位置不相交的字串,取這k個串中任意兩個最長公共字首最小的最為 x\)

\(對所有符合條件的k,求出情況最大的x\)

樣例:

思路:求相同字首匹配方式可以通過 進製hash 來處理,同時對於符合條件的長度,使用二分來優化時間複雜度。

實際上這裡就運用了 字串hash值的方式,我們設定陣列 \(f[i]\) 表示已\(i\)為右端點的字串,然後每次擷取從二分得到的\(x\)長度,記錄相同子串的個數,如果個數大於給定的條件\(k\),則更新長度答案。

#include#define ios ios::sync_with_stdio(0); cin.tie(0);

typedef unsigned long long ull;

using namespace std;

const int maxn = 2e5+5;

ull base = 131;

ull p[maxn],h[maxn];

int f[maxn];//代表以下標為右端點

char s[maxn];

int n,k;

unordered_maplast;

ull get_hash(int l,int r)

bool check(int x)

for(int i=1;i<=n-x+1;i++)

last[get_hash(i,i+x-1)] = 0;//清空

return res >= k;//個數是否超過k

}int main()

int ans = 0;

int l=1,r=n;//二分最大長度

while(l<=r)else

}cout<

return 0;

}

相似的子串 字尾陣列 二分答案

求k個不相交字元子串的最大相同字首長度x。很容易往字尾陣列上靠,但是這還不夠,因為很容易就想偏了,這裡,我們想處理乙個是不重疊,乙個是最大的字首相同,於是,不妨設最長字首為x,然後二分這個x,這是因為height的關係具有連續性,所以這樣就能很清晰的劃分出來我們需要進行處理的sa的區間了。然後我們對...

相似字串

題目描述 對於僅由小寫字母組成得字串a和b,如果,分別存在乙個小寫字母a到z的排列,使得a中所有字母a替換為排列得第乙個字母,所有字母b替換為排列得第二個字母.所有z替換為排列得最後乙個字母之後,a和b完全相同,那麼稱字串a和b相似,如abcc和xyaa。現在給定僅由小寫字母組成且長度不超過10 5...

Hash 字串 字串雜湊

luo gu luogu luogup 3370 p3370 p337 0如題,給定n個字串 第i個字串長度為mi,字串內包含數字 大小寫字母 請求出n個字串中共有多少個不同的字串。第一行包含乙個整數n,為字串的個數。接下來n行每行包含乙個字串,為所提供的字串。輸出包含一行,包含乙個整數,為不同的字...