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

Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。