首先将原本字符串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"); 
     }
}

 

posted on 2017-09-06 19:39  宣毅鸣  阅读(140)  评论(0编辑  收藏  举报