題目描述:
解題思路:
把26個字母分開hash,每一位只用0和1表示這一位是否是字母i。
詢問時也把26個字母分開比較,把等價類裡的hash加起來算。
不同處最多為1,即是最後的hash值只會有乙個形如ba
sei bas
ei的差,判斷一下即可。
#include
#define ll unsigned long long
using
namespace
std;
int getint()
const
int n=100005,c=26;
const ll base=123ll,invbase=3449391168254631603ll;
int n,m,id[n];
int tot,first[n],nxt[n<<1],to[n<<1],c[n<<1];
int dep[n],fa[n][20];
ll bin[n],binv[n],g[n][26],f[n][26],sum1[c],sum2[c];
mapbool>mp;
int find(int x)
void merge(int x,int y)
void add(int x,int y,int z)
void dfs(int u)
ll gethash(int u,int v,int t,int i)
bool check(int u1,int v1,int u2,int v2)
return cnt<=2;
}int main()
for(int i=1;i'a';
add(x,y,z),add(y,x,z);
}dfs(1);
m=getint();int k,u1,v1,u2,v2;char ch[2];
while(m--)
return
0;}
相似串匹配(雜湊)
1 題面 2 題解 現將字串轉化為乙個徑b函式處理過的字串,bs,bt,b函式 如果當前字元i前面有和它相同的字元j,b i i j,否組b i len,這樣處理通過記錄字串的前驅,使字串所有相同字元和不同字元的相對位置都確定下來,相當於乙個鍊錶,所以如果字串q,p是相似子串,則b q b p 然後...
模擬雜湊表 字串雜湊
模擬雜湊表 引入雜湊表就是根據乙個關鍵值key進行高效訪問的資料結構,可以通過雜湊函式把乙個資料當做key進行對映得到乙個儲存位址從而進行訪問。比如想要查詢100個數字範圍在 1 1e8 查詢它們是否有重複的值,那麼就可以用雜湊表來解決這個問題。對於小的數字我們就會習慣的會去乙個陣列進行標記,但是對...
3230 相似子串
輸入第1行,包含3個整數n,q。q代表詢問組數。第2行是字串s。接下來q行,每行兩個整數i和j。1 i j 輸出共q行,每行乙個數表示每組詢問的答案。如果不存在第i個子串或第j個子串,則輸出 1。5 3ababa 3 55 9 8 10 1816 1樣例解釋 第1組詢問 兩個子串是 aba abab...