浙江省赛的第I题Barbecue,用字符串哈希做。
哈希判断回文串:算一个字符串正着过去的哈希值,再算字符串反过来的哈希值。再比较正反字符串的哈希值,相等就说明回文。
贴一下下面的代码,以后碰到相同的题目当作模板来用。(其实写了好几种哈希方法和比较,但是这种相对来说最好理解)
#include <iostream>
#include <string>
using namespace std;
typedef unsigned long long ull;
#define base 2333
const ull N = 1e6 + 5;
ull hash1[N];
ull hash2[N];
ull prev_t[N];
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int n, q;
cin >> n >> q;
string str;
cin >> str;
int len = str.size();
prev_t[0] = 1;
hash1[0] = 0;
hash2[0] = 0;
for (int i = 1; i <= len; i++)//字符串下标为i对应哈希数组的i+1
{
hash1[i] = hash1[i - 1] * base + str[i - 1] - 'a' + 1;
hash2[i] = hash2[i - 1] * base + str[len - i] - 'a' + 1;//反过来的字符串的哈希值
prev_t[i] = prev_t[i - 1] * base;//数组在拿到子串的哈希值时起作用
}
while (q--)
{
int l, r;
cin >> l >> r;
int str_lr = r - l + 1;
if (str_lr % 2 == 0)
{
cout << "Budada\n" ;
}
else if ((hash1[r] - hash1[l - 1] * prev_t[r - l + 1]) ==
hash2[len - l + 1] - hash2[len - r] * prev_t[r - l + 1])//比较一下
{
cout << "Budada\n";
}
else
{
cout << "Putata\n";
}
}
return 0;
}