线段树、KMP、HASH模板
2024-08-30 11:33:45
线段树
#include<cstdio>
using namespace std;
int n,p,a,b,m,x,y,ans;
struct node
{
int l,r,w,f;
}tree[];
inline void build(int k,int ll,int rr)//建树
{
tree[k].l=ll,tree[k].r=rr;
if(tree[k].l==tree[k].r)
{
scanf("%d",&tree[k].w);
return;
}
int m=(ll+rr)/;
build(k*,ll,m);
build(k*+,m+,rr);
tree[k].w=tree[k*].w+tree[k*+].w;
}
inline void down(int k)//标记下传
{
tree[k*].f+=tree[k].f;
tree[k*+].f+=tree[k].f;
tree[k*].w+=tree[k].f*(tree[k*].r-tree[k*].l+);
tree[k*+].w+=tree[k].f*(tree[k*+].r-tree[k*+].l+);
tree[k].f=;
}
inline void ask_point(int k)//单点查询
{
if(tree[k].l==tree[k].r)
{
ans=tree[k].w;
return ;
}
if(tree[k].f) down(k);
int m=(tree[k].l+tree[k].r)/;
if(x<=m) ask_point(k*);
else ask_point(k*+);
}
inline void change_point(int k)//单点修改
{
if(tree[k].l==tree[k].r)
{
tree[k].w+=y;
return;
}
int m=(tree[k].l+tree[k].r)/;
if(x<=m) change_point(k*);
else change_point(k*+);
tree[k].w=tree[k*].w+tree[k*+].w;
}
inline void ask_interval(int k)//区间查询
{
if(tree[k].l>=a&&tree[k].r<=b)
{
ans+=tree[k].w;
return;
}
if(tree[k].f) down(k);
int m=(tree[k].l+tree[k].r)/;
if(a<=m) ask_interval(k*);
if(b>m) ask_interval(k*+);
}
inline void change_interval(int k)//区间修改
{
if(tree[k].l>=a&&tree[k].r<=b)
{
tree[k].w+=(tree[k].r-tree[k].l+)*y;
tree[k].f+=y;
return;
}
if(tree[k].f) down(k);
int m=(tree[k].l+tree[k].r)/;
if(a<=m) change_interval(k*);
if(b>m) change_interval(k*+);
tree[k].w=tree[k*].w+tree[k*+].w;
}
int main()
{
scanf("%d",&n);//n个节点
build(,,n);//建树
scanf("%d",&m);//m种操作
for(int i=;i<=m;i++)
{
scanf("%d",&p);
ans=;
if(p==)
{
scanf("%d",&x);
ask_point(x);//单点查询,输出第x个数
printf("%d",ans);
}
else if(p==)
{
scanf("%d%d",&x,&y);
change_point();//单点修改
}
else if(p==)
{
scanf("%d%d",&a,&b);//区间查询
ask_interval();
printf("%d\n",ans);
}
else
{
scanf("%d%d%d",&a,&b,&y);//区间修改
change_interval();
}
}
}
KMP
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
using namespace std;
char a[];
char b[];
int nxt[];
int la,lb;
void makenext()
{
int k=-,j=;
nxt[j]=k;
while(j<lb)
{
if(k==-||b[j]==b[k])
{
k++,j++;
nxt[j]=k;
}
else
k=nxt[k];
}
}
void kmp()
{
makenext();
int i=,j=;
while(i<la)
{
if(j==-||a[i]==b[j])
j++,i++;
else
j=nxt[j];
if(j==lb)
{
cout<<i-lb+<<endl;
j=,i--;
}
}
}
int main()
{
cin>>a;
cin>>b;
la=strlen(a);
lb=strlen(b);
kmp();
for(int i=;i<=lb;i++)
cout<<nxt[i]<<" ";
return ;
}
HASH
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#define num 500003
using namespace std;
int hash[*num];
int star[];
bool vis[];
int main()
{
memset(hash,-,sizeof(hash));
int n;
cin>>n;
for(int i=;i<n;i++)
{
int x;
bool mark=;
cin>>x;
int y=abs(x)%num;
while(hash[y]>=-)
{
if(hash[y]==x)
{
mark=;
break;
}
y++;
}
hash[y]=x;
if(mark==)
cout<<;
else
cout<<;
}
return ;
}
模板来源
http://www.cnblogs.com/IUUUUUUUskyyy/
最新文章
- ie6、7 下input的边框问题 ?
- js中function参数默认值
- Replication的犄角旮旯(九)-- sp_setsubscriptionxactseqno,赋予订阅活力的工具
- java开源时间/日期库Joda-Time
- Android程序意外Crash后自动重启
- oracel数据库基本知识和基本查询方法
- Android(java)学习笔记89:泛型概述和基本使用
- Linq to XML 读取XML 备忘笔记
- I - Navigation Nightmare-poj 1984
- dataGuard主备库角色切换
- Python 目录操作(转)
- ThinkPHP5高阶实战教程
- PhoenixFD插件流体模拟——UI布局【Foam】详解
- if else; while; break;continue ----流程控制系列
- [C++]PAT乙级1010. 一元多项式求导 (25/25)
- 2018.10.29 bzoj4564: [Haoi2016]地图(仙人掌+莫队)
- Python - for 循环
- 使用jQuery实现图片懒加载原理
- python webdriver 显示等待-自动登录126邮箱,添加联系人
- HTTP协议图--HTTP 协议报文结构