觉得写得还可以点下倒三角呗
C++ 代码
#include<iostream>
using namespace std;
typedef unsigned long long ULL;
int const N=100010,P=131;
int n,m;
char str[N];
ULL h[N],p[N];
ULL get(int l,int r)
{
return h[r]-h[l-1]*p[r-l+1];///计算区间的字符串对应的哈希值
}
int main(void)
{
cin>>n>>m>>(str+1);
p[0]=1;
for(int i=1;i<=n;i++)
{
h[i]=h[i-1]*P+str[i];///字符串在P进制下的哈希值,很大要转化到十进制,需要取模,2^64用ULL直接取代
p[i]=p[i-1]*P; ///p[k]存储 P^k mod 2^64///举个例子如果映射到十进制,在计算[0,r]和[0,l-1]的之间的字符串哈希值需要乘之间的相应位数差的进制
//如:1234,12,之间34的字符串哈希值,12的1(个位)和2(十位)分别要乘到1234的1(千位)和(百位).12的1要乘100,12的2也是.
} //p[0]=1;p[1]=10;p[2]=100;p[3]=1000;p[4]=10000;这里取q[2];
while(m--)
{
int l1,r1,l2,r2;
cin>>l1>>r1>>l2>>r2;
if(get(l1,r1)==get(l2,r2)) cout<<"Yes"<<endl;///比较区间的哈希值
else cout<<"No"<<endl;
}
return 0;
}
我点了踩,别谢我
就你闲(捶死
熟悉的身影,熟悉的操作
555555