题目链接: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; }