题目链接:http://codeforces.com/contest/985/problem/F
按照字符转为01串,直接Hash就好,然后判断的时候,直接排序判断,就可以消除字符之间的区别。
代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MAXN=2e5+5;
const int MOD=1e9+7;
int po[MAXN],f[MAXN][26];
int a[26],b[26];
char s[MAXN];
bool judge(int x,int y,int len)
{
for(int j=0;j<26;j++)
{
a[j]=(f[x+len-1][j]-1LL*f[x-1][j]*po[len]%MOD+MOD)%MOD;
b[j]=(f[y+len-1][j]-1LL*f[y-1][j]*po[len]%MOD+MOD)%MOD;
}
sort(a,a+26);sort(b,b+26);
for(int j=0;j<26;j++)
if(a[j]!=b[j]) return false;
return true;
}
int main()
{
//freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
int n,m;
scanf("%d%d",&n,&m);
scanf("%s",s+1);
po[0]=1;
for(int i=1;i<=n;i++)
po[i]=po[i-1]*2%MOD;
for(int i=1;i<=n;i++)
{
for(int j=0;j<26;j++)
{
f[i][j]=(f[i-1][j]*2+((s[i]-'a')==j?1:0)%MOD)%MOD;
}
}
while(m--)
{
int x,y,len;
scanf("%d%d%d",&x,&y,&len);
if(judge(x,y,len)) puts("YES");
else puts("NO");
}
return 0;
}