51Nod1753 相似子串

2021-08-08 17:02:30 字數 1650 閱讀 8783

兩個字串相似定義為:

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行,每行乙個數表示...