首先将原本字符串hash,注意每一个字母要分开了。
然后并查集判断字符相同,将字符ascll吗乘转化为祖先乘。
然后就可以判断相等的情况。
然后考虑相等的情况。
二分枚举中间点,然后如果左边是不相等并且右边不相等,那么就不是只有一个字符不相等。
否则如果左边不相等判断左边,右边不相等判断右边
时间复杂度:o(nlogn*26)
虽然大约是1e8,而且常数较大,但是有5秒时限
代码:
#include<bits/stdc++.h> using namespace std; int f[26],k,T,l1,r2,l2,r1; char s[2],n[300005]; int get(int x) { if (x==f[x])return x; return f[x]=get(f[x]); } int main() { scanf("%s%d",&n,&T); while (T--) { scanf("%d%d%d%d%d",&k,&l1,&r1,&l2,&r2); for (int i=0;i<26;i++)f[i]=i; l1--;l2--;r1--;r2--; while (k--) { scanf("%s",&s); f[get(s[0]-97)]=f[get(s[1]-97)]; } if (r1-l1!=r2-l2) { puts("NO"); continue; } int num=0,ff=0; for (int i=l1;i<=r1;i++) { if (get(n[i]-97)!=get(n[i+l2-l1]-97))num++; if (num==2) { ff=1; break; } } if (ff)puts("NO"); else puts("YES"); } }