func_code_string: #include <bits/stdc++.h>   using namespace std;   const int maxn = 2e5 + 5;   const int sigma = maxn;   const int HASH_CNT = 2;   int n;   char s[maxn];   unsigned long long Prime_Pool[] = {1998585857ul, 23333333333ul};   unsigned long long Seed_Pool[] = {146527, 19260817};   unsigned long long Mod_Pool[] = {1000000009, 998244353};   unsigned long long has1[26], has2[26];   struct Hash {     unsigned long long Seed, Mod;     unsigned long long bas[maxn];     unsigned long long sum[26][maxn];     int perm[sigma];     void init(int seedIndex, int modIndex) {       Seed = Seed_Pool[seedIndex];       Mod = Mod_Pool[modIndex];       bas[0] = 1;       for (int i = 1; i <= n; i++) {         bas[i] = bas[i - 1] * Seed % Mod;       }       for (int i = 1; i <= n; i++) {         for (int j = 0; j < 26; j++) {           sum[j][i] = (sum[j][i - 1] * Seed % Mod + (s[i] == j +  a )) % Mod;         }       }     }     unsigned long long getHash(int ch, int l, int r) {       return (sum[ch][r] - sum[ch][l - 1] * bas[r - l + 1] % Mod + Mod) % Mod;     }   } hasher[HASH_CNT];   bool check(int l1, int r1, int l2, int r2) {     for (int i = 0; i < HASH_CNT; i++) {       for (int j = 0; j < 26; j++) {         has1[j] = hasher[i].getHash(j, l1, r1);         has2[j] = hasher[i].getHash(j, l2, r2);       }       sort(has1, has1 + 26);       sort(has2, has2 + 26);       for (int j = 0; j < 26; j++)         if (has1[j] != has2[j]) {           return false;         }     }     return true;   }   int main() {     int m, x, y, len;     scanf( %d%d , &n, &m);     scanf( %s , s + 1);     for (int i = 0; i < HASH_CNT; i++) hasher[i].init(i, i);     while (m--) {       scanf( %d%d%d , &x, &y, &len);       if (check(x, x + len - 1, y, y + len - 1))         puts( YES );       else         puts( NO );     }     return 0;   }   