假如两个区间的26的字母出现的位置集合分别是 A1,B1,A2,B2,....., 我们再能找到一个排列p[] 使得 A[i] = B[p[i]] ,那么就可以成功映射了。

显然集合可以直接hash,排序一下hash值就可以判断是否匹配了。。。。

虽然不知道为什么要卡19260817,但反正我是坚决不写双hash的,最后随便换了一个大模数(甚至都不是质数2333)然后就过了。。。

Discription

You are given a string s of length n consisting of lowercase English letters.

For two given strings s and t, say S is the set of distinct characters of s and T is the set of distinct characters of t. The strings s and t are isomorphic if their lengths are equal and there is a one-to-one mapping (bijection) f between S and Tfor which f(si) = ti. Formally:

  1. f(si) = ti for any index i,
  2. for any character  there is exactly one character  that f(x) = y,
  3. for any character  there is exactly one character  that f(x) = y.

For example, the strings "aababc" and "bbcbcz" are isomorphic. Also the strings "aaaww" and "wwwaa" are isomorphic. The following pairs of strings are not isomorphic: "aab" and "bbb", "test" and "best".

You have to handle m queries characterized by three integers x, y, len (1 ≤ x, y ≤ n - len + 1). For each query check if two substrings s[x... x + len - 1] and s[y... y + len - 1] are isomorphic.

Input

The first line contains two space-separated integers n and m (1 ≤ n ≤ 2·105, 1 ≤ m ≤ 2·105) — the length of the string s and the number of queries.

The second line contains string s consisting of n lowercase English letters.

The following m lines contain a single query on each line: xiyi and leni (1 ≤ xi, yi ≤ n, 1 ≤ leni ≤ n - max(xi, yi) + 1) — the description of the pair of the substrings to check.

Output

For each query in a separate line print "YES" if substrings s[xi... xi + leni - 1] ands[yi... yi + leni - 1] are isomorphic and "NO" otherwise.

Example

Input
7 4
abacaba
1 1 1
1 4 2
2 1 3
2 4 3
Output
YES
YES
NO
YES

Note

The queries in the example are following:

  1. substrings "a" and "a" are isomorphic: f(a) = a;
  2. substrings "ab" and "ca" are isomorphic: f(a) = cf(b) = a;
  3. substrings "bac" and "aba" are not isomorphic since f(b) and f(c) must be equal to a at same time;
  4. substrings "bac" and "cab" are isomorphic: f(b) = cf(a) = af(c) = b.
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int maxn=200005,ha=998244357,b=233;
inline int add(int x,int y){ x+=y; return x>=ha?x-ha:x;}
int H[maxn][26],ci[maxn],A[26],B[26];
int n,Q,X,Y,L;
char ch; inline void Get(int *x,int y){
for(int i=0;i<26;i++) x[i]=add(H[y+L-1][i],ha-H[y-1][i]*(ll)ci[L]%ha);
} inline void solve(){
int i;
while(Q--){
scanf("%d%d%d",&X,&Y,&L);
Get(A,X),Get(B,Y); sort(A,A+26),sort(B,B+26); for(i=0;i<26;i++) if(A[i]!=B[i]) break;
puts(i==26?"YES":"NO");
}
} int main(){
scanf("%d%d",&n,&Q); ci[0]=1;
for(int i=1;i<=n;i++) ci[i]=(ci[i-1]*(ll)b)%ha; for(int i=1;i<=n;i++){
ch=getchar();
while(ch<'a'||ch>'z') ch=getchar(); for(int j=0;j<26;j++) H[i][j]=(H[i-1][j]*(ll)b)%ha;
H[i][ch-'a']++;
} solve(); return 0;
}

  

最新文章

  1. springBoot上传文件大小设置
  2. C#-WebForm-★ 制作图片验证码 ★
  3. 3016 质子撞击炮 II
  4. ArcGIS地图文档MXD效率慢的一点建议(二)
  5. Wafer管芯数量及成本估算
  6. Axure RP中线条的设置
  7. centOS设为文本启动方式
  8. javascript中函数声明与函数表达式的区别
  9. C# Post和Get请求
  10. 【原】spring boot添加cros全局过滤器
  11. python+eclipse+pydev开发环境搭建
  12. 算法第四版jar包下载地址
  13. python特色_字典,元组,列表
  14. jdbc配置Spring
  15. 详细解读简单的lstm的实例
  16. 使用 resizableImageWithCapInsets 方法实现可伸缩图片
  17. learning docker steps(5) ----- docker stack 初次体验
  18. 【Linux 命令】 rsync 目录覆盖软链接,保持软链接不变并同步目录内容
  19. MongoDB图形化管理工具Toad Mac Edition
  20. 腾讯云CMQ消息队列在Linux环境下的使用

热门文章

  1. Linux认知之旅【05 进一步了解Linux装软件】!
  2. python学习_循环结构 and 类型判断
  3. java 计算精度处理
  4. 阻塞&amp;&amp;非阻塞
  5. JVM垃圾回收机制GC
  6. Using Let’s Encrypt for free SSL Certs with Netscaler
  7. [Codeforces438E][bzoj3625] 小朋友和二叉树 [多项式求逆+多项式开根]
  8. BZOJ3456 城市规划 【分治NTT】
  9. 小L的占卜
  10. 第二届360杯全国大学生信息安全技术大赛部分解题思路(WEB安全)