ural 1989(树状数组+多项式hash)
题意:给出一个字符串。有两种操作,一个是p a b,问字符串从位置a到位置b的子串是否是一个回文子串。还有一个操作 c a b,把字符串位置a的字符替换为b。
题解:由于字符串长度为1e5且问的次数也有1e5,所以暴力肯定是会超时的,然后考虑用树状数组维护字符串的hash值来解,两个操作分别用正反方向区间比对哈希值和单点改动。
#include <cstdio>
#include <cstring>
#include <algorithm>
#define ULL unsigned long long
using namespace std;
const int N = 100005;
int n, m, l, r, pos;
char str[N], q[20], c;
ULL C[N][2], Hash[N]; int lowbit(int x) {
return x & (-x);
} ULL Sum(int x, int y) {
ULL ret = 0;
while (x > 0) {
ret += C[x][y];
x -= lowbit(x);
}
return ret;
} void Add(int x, ULL d, int y) {
while (x <= n) {
C[x][y] += d;
x += lowbit(x);
}
} int main() {
Hash[0] = 1;
for (int i = 1; i < N; i++)
Hash[i] = Hash[i - 1] * 27;//都是小写字母
while (scanf("%s", str) == 1) {
memset(C, 0, sizeof(C));
n = strlen(str);
for (int i = 0; i < n; i++) {
Add(i + 1, (str[i] - 'a') * Hash[i], 0);
Add(i + 1, (str[n - i - 1] - 'a') * Hash[i], 1);
}
scanf("%d", &m);
while (m--) {
scanf("%s", q);
if (q[0] == 'p') {
scanf("%d%d", &l, &r);
ULL h1 = (Sum(r, 0) - Sum(l - 1, 0)) * Hash[n - r];
ULL h2 = (Sum(n - l + 1, 1) - Sum(n - r, 1)) * Hash[l - 1];
if (h1 == h2)
printf("Yes\n");
else
printf("No\n");
}
else {
scanf("%d %c", &pos, &c);
int x = c - str[pos - 1];
Add(pos, x * Hash[pos - 1], 0);
Add(n - pos + 1, x * Hash[n - pos], 1);
str[pos - 1] = c;
}
}
}
return 0;
}
ural 1989(树状数组+多项式hash)的更多相关文章
- CF452F Permutations/Luogu2757 等差子序列 树状数组、Hash
传送门--Luogu 传送门--Codeforces 如果存在长度\(>3\)的等差子序列,那么一定存在长度\(=3\)的等差子序列,所以我们只需要找长度为\(3\)的等差子序列.可以枚举等差子 ...
- bzoj 2124 等差子序列 树状数组维护hash+回文串
等差子序列 Time Limit: 3 Sec Memory Limit: 259 MBSubmit: 1919 Solved: 713[Submit][Status][Discuss] Desc ...
- 【BZOJ2124】等差子序列 树状数组维护hash值
[BZOJ2124]等差子序列 Description 给一个1到N的排列{Ai},询问是否存在1<=p1<p2<p3<p4<p5<…<pLen<=N ...
- URAL 2062 树状数组
一个长度为n的数组 每次对lr区间进行修改 如果要修改i 则对i i*2 i*3...都修改 最后单点查询值 思想是利用树状数组维护每一个区间的更新值 查询的时候得出这个点的所有因子的查询值的和 加上 ...
- URAL-1989 Subpalindromes 多项式Hash+树状数组
题目链接:http://acm.timus.ru/problem.aspx?space=1&num=1989 题意:给出一个字符串,m个操作:1,修改其中一个字符串,2,询问 [a, b] 是 ...
- [bzoj2124]等差子序列(hash+树状数组)
我又来更博啦 2124: 等差子序列 Time Limit: 3 Sec Memory Limit: 259 MBSubmit: 941 Solved: 348[Submit][Statu ...
- acdream1197 Points In Cuboid(hash树状数组)
题目链接:http://acdream.info/problem?pid=1197 题意:给出三维空间n个点,m个查询,每次查询某个立方体内的点的个数. 思路:按照一维排序,根据查询插入,其他两位用二 ...
- ACdreamoj 1011(树状数组维护字符串hash前缀和)
题目链接:http://acdream.info/problem? pid=1019 题意:两种操作,第一种将字符串某个位置的字符换为还有一个字符.另外一种查询某个连续子序列是否是回文串: 解法:有两 ...
- bzoj 1669: [Usaco2006 Oct]Hungry Cows饥饿的奶牛【dp+树状数组+hash】
最长上升子序列.虽然数据可以直接n方但是另写了个nlogn的 转移:f[i]=max(f[j]+1)(a[j]<a[i]) O(n^2) #include<iostream> #in ...
随机推荐
- Vue生命周期函数的应用
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- linux中fork()函数详解(搬砖)
一.fork入门知识 一个进程,包括代码.数据和分配给进程的资源.fork()函数通过系统调用创建一个与原来进程几乎完全相同的进程,也就是两个进程可以做完全相同的事,但如果初始参数或者传入的变量不同, ...
- 讲一讲java异常及自定义异常
1.异常,说白了.两种,一种就是就是不能让代码通过编译的异常.另一种就是程序运行期间出现的异常.异常就是错误,只要出现异常,程序就不会向下运行了.就不会执行后面的代码了.这时候就可以通过显示statc ...
- HDU 4305 Contest 1
感觉是有很多细节要处理的.尤其是求逆元后的运算,应该是存在超范围的情况的. #include <iostream> #include <cstdio> #include < ...
- githubclient配置方法简述
/*********************************************************** * Author : Samson * Date : 08/15/2015 * ...
- 关闭 sftp
vi /etc/ssh/sshd_config 注释掉这行Subsystem sftp /usr/libexec/openssh/sftp-server /etc/rc.d/init.d/ss ...
- nyoj--586--疯牛(二分&&枚举)
疯牛 时间限制:1000 ms | 内存限制:65535 KB 难度:4 描述 农夫 John 建造了一座很长的畜栏,它包括N (2 <= N <= 100,000)个隔间,这些小隔间 ...
- xxx while the managed IDbConnection interface was being used: Login failed for user xxx
Process cube的时候遇到如下错误. Errors in the high-level relational engine. The following exception occurre ...
- (转载)10个实用的但偏执的Java编程技术
10个实用的但偏执的Java编程技术 在沉浸于编码一段时间以后(比如说我已经投入近20年左右的时间在程序上了),你会渐渐对这些东西习以为常.因为,你知道的…… 作者:小峰来源:码农网|2015-09- ...
- 大数相乘(牛客网ac通过)
2019-05-172019-05-17 大数相乘基本思想: 相乘相加,只不过大于10先不进位到计算完后统一进位 #include <iostream> #include <stri ...