xsy 相似字串

2021-10-23 11:29:22 字數 1244 閱讀 3666

輸入第1行,包含3個整數n,q。q代表詢問組數。

第2行是字串s。

接下來q行,每行兩個整數i和j。(1≤i≤j)。

輸出共q行,每行乙個數表示每組詢問的答案。如果不存在第i個子串或第j個子串,則輸出-1。

關於這道題的每個詢問首先要求出第i小和第j小的子串在原串的位置,然後快速地求出這兩個子串的最長公共字首和字尾。

第乙個步驟我們可以用二分搞定,通過原串的height陣列我們可以求出乙個sum陣列,sum[i]表示按照字典序排序後,前i個字尾中共有多少個本質不同的子串。在n個字尾中,每個子串都可以被表示為某個字尾的字首,所以我們在sum陣列中二分查詢出第乙個不小於k的sum[i]來求原串第k小的子串。那麼第i個字尾的某個字首就是所需的子串了,這個稍微計算一下得出。

我們得出了兩個子串[la,ra]和[lb,rb],要求它們的最長公共字首以及字尾,最長公共字首就是height陣列上的區間最小值問題了,那麼字尾我們按照原串的反串建立字尾陣列也就變成了height陣列上的區間最小值問題了。

然後rmq一下解決問題。

#include

#include

#include

#include

#include

#include

#include

using

namespace std;

typedef

long

long ll;

const

int maxn=

1e5+50;

inline ll read()

while

(ch>=

'0'&&ch<=

'9')

return i*f;

}char ch[maxn]

;int n,q,c[maxn]

,log[maxn+

500]

;struct st

}inline

void

getheight()

inline

void

pre(

)inline

intquery

(int x1,

int x2)

}a,b;

intmain()

}return0;

}

相似字串

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

字串相似度

這個演算法 於網上,但忘記了出處,對其使使用了 issame封裝,然後用在了自己的網頁資料抓取 中。求解兩個字串的相似度int calculatestringdistance const string stra,const string strb intret c lena 1 lenb 1 for...

字串相似度

最近要對字串進行聚類,這些字串都是 的輸出,嘗試了幾種字串相似度度量的方法 levenshtein距離 字串核函式 lcs max len str1,str2 其中相似度用公式distance 1.0 similarity 1轉換為距離.使用層次聚類方法.下面是要聚類的字串 points aabbc...