思路 代码 #include <bits/stdc++.h> using namespace std; typedef long long ll; const int M=200005; const ll MOD=1e9+7; char s[M]; ll px[M],X=107,h[26][M]; int main() { int n,m; scanf("%d%d%s",&n,&m,s+1); px[0]=1; for(int i=1;i<=n;i++)px[i]=px[i-1]*X%MOD; for(int i=0;i<26;i++)//将s转化成01不同字符的01串 { for(int j=1;j<=n;j++)h[i][j]=(h[i][j-1]*X+ll(s[j]=='a'+i))%MOD; } while(m--) { int x,y,l; scanf("%d%d%d",&x,&y,&l); vector<int> p,q; for(int i=0;i<26;i++)//将子串的所有关于字符的01串的hash求出来 { q.push_back((h[i][x+l-1]-px[l]*h[i][x-1]%MOD+MOD)%MOD); p.push_back((h[i][y+l-1]-px[l]*h[i][y-1]%MOD+MOD)%MOD); } sort(p.begin(),p.end());//排序看一下是否每一个值对应相等即可 sort(q.begin(),q.end()); if(p==q)cout << "YES" else cout << "NO"; } return 0; }