Kefa and Watch
题意:
维护一个长度为n的字符串,两种操作:
1.将 [l,r] 的字符变为 c
2.询问 d 是否为 $S(l,r)$ 的周期
解法:
首先分析如何令 [l,r] 的周期为d,利用循环串的性质得:
只需要保证 $S(l+d,r) = S(l,r-d)$ 即可。
注意$S(l,r)$周期为 d 的定义是对于$l<=i<=r-d$有$S(i+d) = S(i)$从而,只需要维护hash即可。
应用线段树可以$O(nlogn)$
注意hash一般都要用两个模数,不然极易被卡。
好久没写hash,WA了几下。
#include <iostream>
#include <cstdio>
#include <cstring> #define l(x) ch[x][0]
#define r(x) ch[x][1]
#define N 100010
#define LL unsigned long long
#define P 1000000007ULL using namespace std; int totn,n,m,K;
int ch[N<<][];
char S[N];
int siz[N<<],setv[N<<];
LL power[N],power_mod[N];
LL Spower[N],Spower_mod[N];
LL hashv[N<<];
LL hash_mod[N<<]; void update(int x)
{
siz[x]=siz[l(x)]+siz[r(x)];
hashv[x] = hashv[l(x)]*power[siz[r(x)]] + hashv[r(x)];
hash_mod[x] = (hash_mod[l(x)]*power_mod[siz[r(x)]]%P + hash_mod[r(x)])%P;
} void push(int x)
{
if(setv[x]==-) return;
setv[l(x)]=setv[r(x)]=setv[x];
hashv[l(x)]=Spower[siz[l(x)]-] * (LL)setv[x];
hashv[r(x)]=Spower[siz[r(x)]-] * (LL)setv[x];
hash_mod[l(x)]=Spower_mod[siz[l(x)]-] * (LL)setv[x] % P;
hash_mod[r(x)]=Spower_mod[siz[r(x)]-] * (LL)setv[x] % P;
setv[x]=-;
} int build(int l,int r)
{
int x=++totn;
setv[x]=-;
if(l==r)
{
hash_mod[x]=hashv[x]=S[l-]-'';
siz[x]=;
return x;
}
int mid=(l+r)>>;
l(x)=build(l,mid);
r(x)=build(mid+,r);
update(x);
return x;
} LL ask_mod(int x,int l,int r,int ql,int qr,int &sizv)
{
if(ql<=l && r<=qr)
{
sizv=siz[x];
return hash_mod[x];
}
push(x);
int mid=(l+r)>>,tmp_sizv;
if(ql<=mid && mid<qr)
{
sizv=;
LL tmp1=ask_mod(l(x),l,mid,ql,qr,tmp_sizv);
sizv+=tmp_sizv;
LL tmp2=ask_mod(r(x),mid+,r,ql,qr,tmp_sizv);
sizv+=tmp_sizv;
update(x);
return (tmp1*power_mod[tmp_sizv]%P+tmp2)%P;
}
if(ql<=mid)
{
LL ans=ask_mod(l(x),l,mid,ql,qr,sizv);
update(x);
return ans;
}
else
{
LL ans=ask_mod(r(x),mid+,r,ql,qr,sizv);
update(x);
return ans;
}
} LL ask(int x,int l,int r,int ql,int qr,int &sizv)
{
if(ql<=l && r<=qr)
{
sizv=siz[x];
return hashv[x];
}
push(x);
int mid=(l+r)>>,tmp_sizv;
if(ql<=mid && mid<qr)
{
sizv=;
LL tmp1=ask(l(x),l,mid,ql,qr,tmp_sizv);
sizv+=tmp_sizv;
LL tmp2=ask(r(x),mid+,r,ql,qr,tmp_sizv);
sizv+=tmp_sizv;
update(x);
return tmp1*power[tmp_sizv]+tmp2;
}
if(ql<=mid)
{
LL ans=ask(l(x),l,mid,ql,qr,sizv);
update(x);
return ans;
}
else
{
LL ans=ask(r(x),mid+,r,ql,qr,sizv);
update(x);
return ans;
}
} void set(int x,int l,int r,int ql,int qr,int qv)
{
if(ql<=l && r<=qr)
{
setv[x] = qv;
hashv[x] = Spower[siz[x]-]*(LL)setv[x];
hash_mod[x] = (Spower_mod[siz[x]-] * (LL)setv[x]) % P;
return;
}
push(x);
int mid=(l+r)>>;
if(ql<=mid) set(l(x),l,mid,ql,qr,qv);
if(mid<qr) set(r(x),mid+,r,ql,qr,qv);
update(x);
} int main()
{
power[]=power_mod[]=;
for(int i=;i<N;i++)
{
power[i] = power[i-]*10ULL;
power_mod[i] = power_mod[i-]*10ULL%P;
}
Spower[]=Spower_mod[]=;
for(int i=;i<N;i++)
{
Spower[i] = Spower[i-] + power[i];
Spower_mod[i] = (Spower_mod[i-] + power_mod[i])%P;
}
while(~scanf("%d%d%d",&n,&m,&K))
{
scanf("%s",S);
totn=;
build(,n);
int cmd,l,r,x;
for(int i=;i<=m+K;i++)
{
scanf("%d%d%d%d",&cmd,&l,&r,&x);
if(cmd==) set(,,n,l,r,x);
else
{
int d=x;
if(r-l+==d)
{
puts("YES");
continue;
}
if(ask(,,n,l+d,r,x)==ask(,,n,l,r-d,x)
&& ask_mod(,,n,l+d,r,x)==ask_mod(,,n,l,r-d,x))
puts("YES");
else puts("NO");
}
}
}
return ;
}
/*
20 1 2
34075930750342906718
2 1 20 20
1 1 20 6
2 1 20 1
*/
Kefa and Watch的更多相关文章
- codeforces 580D:Kefa and Dishes
Description When Kefa came to the restaurant and sat at a table, the waiter immediately brought him ...
- CF 321B Kefa and Company(贪心)
题目链接: 传送门 Kefa and Company time limit per test:2 second memory limit per test:256 megabytes Desc ...
- Kefa and Park
#include<bits/stdc++.h> #define max 100005 using namespace std; int cats[max]; vector<int&g ...
- B - Kefa and Company
B - Kefa and Company Time Limit:2000MS Memory Limit:262144KB 64bit IO Format:%I64d & %I6 ...
- Codeforces Round #321 (Div. 2) D. Kefa and Dishes 状压dp
题目链接: 题目 D. Kefa and Dishes time limit per test:2 seconds memory limit per test:256 megabytes 问题描述 W ...
- Codeforces Round #321 (Div. 2) E. Kefa and Watch 线段树hash
E. Kefa and Watch Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/580/prob ...
- Codeforces Round #321 (Div. 2) C. Kefa and Park dfs
C. Kefa and Park Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/580/probl ...
- Codeforces Round #321 (Div. 2) B. Kefa and Company 二分
B. Kefa and Company Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/580/pr ...
- Codeforces Round #321 (Div. 2) A. Kefa and First Steps 水题
A. Kefa and First Steps Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/58 ...
- Codeforces 841A - Generous Kefa
题目链接:http://codeforces.com/problemset/problem/841/A One day Kefa found n baloons. For convenience, w ...
随机推荐
- 【每日Scrum】第二天(4.12) TD学生助手Sprint1站立会议
TD学生助手Sprint1站立会议(4.12) 任务看板 站立会议内容 组员 昨天 今天 困难 签到 刘铸辉 (组长) 做了几个Sqlite编辑事件导入数据库没成功,就编辑图片滑动显示功能 今天学习了 ...
- HDMI速率计算
我们在采集HDMI口的数据时,首先肯定要计算它的速率是多少.怎么计算这个速率,本文要跟大家分享的便是这个事情. HDMI口有三个TM-DS(Time Minimized Differential Si ...
- C#基础关键字
1:override & new public class A { public virtual void Test() { Console.WriteLine("A Test()& ...
- UVA1422-Processor(二分法+优先队列)
option=com_onlinejudge&Itemid=8&category=512&page=show_problem&problem=4168"> ...
- kubernetes调度之资源配额示例
系列目录 前面说过,资源配额限制在指定名称空间下,对资源对象数量和特定类型的资源的限制,你可以在ResourceQuota中指定配额 创建名称空间 我们创建一个新的名称空间来演示 kubectl cr ...
- ubuntu 下的中文输入法的安装和配置- ibus
ibus输入法 Chinese语言包安装 首先需要给Ubuntu16.04安装Chinese语言包支持. 如上图点击其中的Install/Remove Languages…,这个对话框是通过syst ...
- 从士兵到程序员再到SOHO程序员 (二)
原文地址: http://blog.huhao.name/blog/2013/12/13/become-a-freelancer-2/ 作者:胡皓 Blog:From Soldier to Progr ...
- Why containers? Why should we care? 新旧容器的对比
https://kubernetes.io/docs/concepts/overview/what-is-kubernetes/ The Old Way to deploy applications ...
- java中科学计数法数字转字符串
开发过程中有可能会遇到很小的数字,在显示过程中就转换成了科学计数法,这种不利于人的观看,于是就有必要转成字符串形式的.so. 将科学计数法的数字转换成字符串: 使用的是java.math的BigDec ...
- Java 符号引用 与 直接引用
在类的加载过程中的解析阶段,Java虚拟机会把类的二进制数据中的符号引用 替换为 直接引用,如Worker类中一个方法: public void gotoWork(){ car.run(); //这段 ...