codeforces 985 F. Isomorphic Strings(hash)

题目链接:http://codeforces.com/contest/985/problem/F

思路:对每个字母hash,只要每一段区间的所有字母hash值排序后相同,那么就是一一映射。

ull这题被卡了好像。。。。

网上说这个base和mod好点不知道真的假的,存着再说。

base = 163 
moder = 9905411 || 1e9+7

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <cctype>
#include <iostream>
#include <algorithm>
#include <string>
#include <vector>
#include <queue>
#include <map>
#include <set>
#include <sstream>
#include<iomanip>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const ll inff = 0x3f3f3f3f3f3f3f3f;
#define FOR(i,a,b) for(int i(a);i<=(b);++i)
#define FOL(i,a,b) for(int i(a);i>=(b);--i)
#define REW(a,b) memset(a,b,sizeof(a))
#define inf int(0x3f3f3f3f)
#define si(a) scanf("%d",&a)
#define sl(a) scanf("%I64d",&a)
#define sd(a) scanf("%lf",&a)
#define ss(a) scanf("%s",a)
#define mod int(1e9+7)
#define lc (d<<1)
#define rc (d<<1|1)
#define Pll pair<ll,ll>
#define P pair<int,int>
#define pi acos(-1)
string a;
const ll base=163;
int n,m;
ll b[200008],ha[200008][26],c[26],d[26];
void as()
{
    b[0]=1;
    FOR(i,1,200000)  b[i]=(b[i-1]*base)%mod;
    FOR(i,1,n)
     FOR(j,0,25)    ha[i][j]=(ha[i-1][j]*base+('a'+j==a[i-1]))%mod;
}
ll dog(int l,int r,int i)
{
    return ((ha[r][i]-ha[l-1][i]*b[r-l+1])%mod+mod)%mod;
}
bool cheak(int x,int y,int z)
{
    FOR(i,0,25)    c[i]=dog(x,x+z-1,i),d[i]=dog(y,y+z-1,i);
    sort(c,c+26);
    sort(d,d+26);
    FOR(i,0,25)
      if(c[i]!=d[i])  return 0;
    return 1;
}
int main()
{
    cin.tie(0);
    cout.tie(0);
    si(n),si(m);
    cin>>a;
    as();
    int x,y,z;
    while(m--)
    {
        si(x),si(y),si(z);
        if(cheak(x,y,z))  puts("YES");
        else   puts("NO");
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_40858062/article/details/80450241
今日推荐