题目描述
PIPI双来考查大家字符串处理的能力啦。
给定一个字符串S,以及q次询问。
每次询问给出两个正整数L,R,你需要回答S[L~R]是否为回文串。
输入
第一行给出字符串S,|S|<=1e6. 保证字符串仅由小写字母构成。
第二行给出询问次数q,q<=1e6.
接下来每行给出两个整数L,R,1<=L,R<=|S|.
输出
对于每个询问,若字符串S中[L,R]为回文串,输出YES,否则输出NO。
样例输入
abccba
5
1 6
2 5
3 4
1 3
1 1
样例输出
YES
YES
YES
NO
YES
#include<bits/stdc++.h>
using namespace std;
typedef signed long long ull; ///使用ull可以自然溢出
const ull base=23333;
const int N=1e6+7;
ull hs[N],hs_[N],pw[N]; ///正向哈希数组和反向哈希数组
char s[N];
main()
{
scanf("%s",s+1);
pw[0]=1;
int n=strlen(s+1);
for(int i=1;i<=n;i++) pw[i]=pw[i-1]*base;
for(int i=1;i<=n;i++)
{
hs[i]=hs[i-1]*base+s[i]-'a'+1; ///哈希值从1开始 防止出现ab=b的现象
hs_[i]=hs_[i-1]*base+s[n-i+1]-'a'+1;
}
int m;
scanf("%d",&m);
while(m--)
{
int l,r;
scanf("%d%d",&l,&r);
if(hs[r]-hs[l-1]*pw[r-l+1]==hs_[n-l+1]-hs_[n-r]*pw[r-l+1]) printf("YES\n"); ///切记这里的反向哈希数组中的下标应该与正向哈希数组中的下标值对称比较,正向为1 3则反向应为4 6
else printf("NO\n");
}
}