兩個字串相似定義為:
1.兩個字串長度相等
2.兩個字串對應位置上有且僅有至多乙個位置所對應的字元不相同
給定乙個字串,每次詢問兩個子串在給定的規則下是否相似。給定的規則指每次給出一些等價關係,如『a』=』b』,『b』=』c』等,注意這裡的等價關係具有傳遞性,即若『a』=』b』,『b』=』c』,則『a』=』c』。
input
第一行乙個字串s(1<=|s|<=300000)
第二行乙個整數t(1<=t<=300000)
對於每次詢問:
第一行5個整數k,l1,r1,l2,r2,表示有k個等價規則,詢問的是子串[l1,r1],l2,r2
接下來k行每行兩個連續的字元表示這兩個字元等價。
此題中所有的字元均為小寫字母。
output
t行,若相似則輸出「yes」否則輸出「no」
input示例
abac
3 1 1 2 3 4
bc 1 1 2 3 4
ac 1 1 2 2 3
ac output示例
yes
yes
no題解
sum[i][j]表示字元j,從1-i的雜湊值之和。
等價字元用並查集合並,累加區間雜湊值。
判斷同乙個集合雜湊值是否相同或者相差乙個雜湊數。
**
#include
#define mod 6999983
#define inv 499122177
#define n 1000005
#define pa pair
typedef __float128 f;
typedef long
long ll;
using namespace std;
inline int read()
return x;
}int n,a1[30],a2[30],f[30],sum1[300005][27],fac1[300005],fac2[300005];
int b1[300005],b2[300005],sum2[300005][27];
char s[300005];
bool hash1[7000005],hash2[7000005];
int find(int i)
inline void union(int a,int b)
}inline void solve()
for (int i=1;i<=26;i++)
char ch[5];
while (k--)
int flag=0,ans1=0,ans2=0;
for (int i=1;i<=26;i++)
if (!((hash1[ans1]&&hash2[ans2])||(hash1[mod-ans1]&&hash2[mod-ans2])))}}
puts("yes");
}int main()
for (int i=1;i<=n;i++)
for (int j=1;j<=26;j++)
int case=read();
while (case--) solve();
return
0;}
51nod 1753 相似子串
兩個字串相似定義為 1.兩個字串長度相等 2.兩個字串對應位置上有且僅有至多乙個位置所對應的字元不相同 給定乙個字串,每次詢問兩個子串在給定的規則下是否相似。給定的規則指每次給出一些等價關係,如 a b b c 等,注意這裡的等價關係具有傳遞性,即若 a b b c 則 a c 第一行乙個字串s 1...
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...
bzoj 3230 相似子串
time limit 20 sec memory limit 128 mb submit 1767 solved 438 submit status discuss 輸入第1行,包含3個整數n,q。q代表詢問組數。第2行是字串s。接下來q行,每行兩個整數i和j。1 i j 輸出共q行,每行乙個數表示...