算了还是说道水题吧
这是道字符串hash。
判断一个字符串中两个区间是否相等。
把a到z对应为1到26,为了不影响后面的情况并且表示出顺序,需要把前缀子串统计出来并且每次输入一个数就把前的乘一个大于26的质数(我觉得选29就够了,然后开unsigned int其实也可以过的),然后再开个p数组记录每位的权值。
每个区间 [ l , r ] [l,r] [l,r] 的hash值即为 r r r 的前缀 − - − l − 1 l-1 l−1的前缀 ∗ * ∗ p [ r − l + 1 ] p[r-l+1] p[r−l+1](需要进的位数)
比较每次是否相等就过了。
还是再贴下代码吧。。。
#include<bits/stdc++.h>
using namespace std;
#define ui unsigned int
#define fi(a) freopen(a,"r",stdin)
#define fo(a) freopen(a,"w",stdout)
#define sfd(n) scanf("%d",&n)
#define sfs(n) scanf("%s",n+1)
#define f1(i,l,r) for(int i=l;i<=r;++i)
#define pfd(n) printf("%d",n)
const int N=1e6+10;
int m,l1,l2,r1,r2,len;
char s[N];
ui f[N],p[N]={1};
void freo(){fi("test.in"); fo("test.out");}
void init(){
sfs(s); len=strlen(s+1); f1(i,1,len)
f[i]=f[i-1]*29+(s[i]-'a'+1),p[i]=p[i-1]*29;
}
void work(){
sfd(m); f1(i,1,m){
sfd(l1); sfd(r1); sfd(l2); sfd(r2);
if(f[r1]-f[l1-1]*p[r1-l1+1]==f[r2]-f[l2-1]*p[r2-l2+1]) printf("Yes\n");
else printf("No\n");
}
}
int main(){freo(); init(); work(); return 0;}