Educational Codeforces Round 44 (Rated for Div. 2) F. Isomorphic Strings(Hash)

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

猜你喜欢

转载自blog.csdn.net/sinat_32872703/article/details/80411985