輸入第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...