51Nod1553 周期串查询
我们发现需要动态维护一个字符串是否成周期
根据border的一个简单性质,得出周期串的充分必要条件是,如果a[i..k]=a[j-k+1..j] 那么a[i..j]是以k为周期的串
于是可以用线段树来维护哈希
莫名其妙rank1..
#include<stdio.h>
#include<string.h>
#include<algorithm>
#define N 100010
#define LL long long
#define mid (l+r>>1)
#define ls x<<1
#define rs x<<1|1
using namespace std;
int n,m,k,s[N<<2]; char c[N];
LL bas[N],p[10][N],w[N<<2];
inline void ps(int l,int r,int x){
w[x]=w[ls]*bas[r-l+1>>1]+w[rs];
}
inline void pd(int x,int m){
if(s[x]){
s[ls]=s[rs]=s[x];
w[ls]=p[s[x]-'0'][m+1>>1];
w[rs]=p[s[x]-'0'][m>>1];
s[x]=0;
}
}
inline void build(int l,int r,int x){
if(l==r){ w[x]=c[l]-'0'; return; }
build(l,mid,ls);
build(mid+1,r,rs);
ps(l,r,x);
}
inline void update(int l,int r,int x,int L,int R,int k){
if(L<=l && r<=R){ w[x]=p[k-'0'][r-l+1]; s[x]=k; return; }
pd(x,r-l+1);
if(L<=mid) update(l,mid,ls,L,R,k);
if(mid<R) update(mid+1,r,rs,L,R,k);
ps(l,r,x);
}
inline LL gH(int l,int r,int x,int L,int R){
if(L<=l && r<=R) return w[x];
pd(x,r-l+1); LL S=0;
if(L<=mid) S=gH(l,mid,ls,L,R);
if(mid<R) S=S*bas[min(r,R)-mid]+gH(mid+1,r,rs,L,R);
return S;
}
int main(){
scanf("%d%d%d%s",&n,&m,&k,c+1); m+=k;
for(int i=*bas=1;i<=n;++i){
bas[i]=bas[i-1]*13;
for(int j=0;j<10;++j)
p[j][i]=p[j][i-1]*13+j;
}
build(1,n,1);
for(int o,l,r,c;m--;){
scanf("%d%d%d%d",&o,&l,&r,&c);
if(o==1) update(1,n,1,l,r,c+'0');
else {
if(c==r-l+1) puts("YES");
else if(gH(1,n,1,l,r-c)==gH(1,n,1,l+c,r)) puts("YES"); else puts("NO");
}
}
}
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从二进制到误差:逐行拆解C语言浮点运算中的4008175468544之谜
· .NET制作智能桌面机器人:结合BotSharp智能体框架开发语音交互
· 软件产品开发中常见的10个问题及处理方法
· .NET 原生驾驭 AI 新基建实战系列:向量数据库的应用与畅想
· 从问题排查到源码分析:ActiveMQ消费端频繁日志刷屏的秘密
· C# 13 中的新增功能实操
· Ollama本地部署大模型总结
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(4)
· langchain0.3教程:从0到1打造一个智能聊天机器人
· 2025成都.NET开发者Connect圆满结束