线段树

#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/

 

线段树、KMP、HASH模板的更多相关文章

  1. 线段树 + 字符串Hash - Codeforces 580E Kefa and Watch

    Kefa and Watch Problem's Link Mean: 给你一个长度为n的字符串s,有两种操作: 1 L R C : 把s[l,r]全部变为c; 2 L R d : 询问s[l,r]是 ...

  2. cf213E 线段树维护hash

    链接 https://codeforces.com/contest/213/problem/E 题目大意 给出两个排列a.b,长度分别为n.m,你需要计算有多少个x,使 得\(a_1 + x; a_2 ...

  3. MemSQL Start[c]UP 2.0 - Round 1 F - Permutation 思维+线段树维护hash值

    F - Permutation 思路:对于当前的值x, 只需要知道x + k, x - k这两个值是否出现在其左右两侧,又因为每个值只有一个, 所以可以转换成,x+k, x-k在到x所在位置的时候是否 ...

  4. hdu1698(线段树区间替换模板)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1698 题意: 第一行输入 t 表 t 组测试数据, 对于每组测试数据, 第一行输入一个 n , 表示 ...

  5. BZOJ 2124: 等差子序列 线段树维护hash

    2124: 等差子序列 Description 给一个1到N的排列{Ai},询问是否存在1<=p1=3),使得Ap1,Ap2,Ap3,…ApLen是一个等差序列. Input 输入的第一行包含一 ...

  6. 【BZOJ 3196】二逼平衡树 线段树套splay 模板题

    我写的是线段树套splay,网上很多人写的都是套treap,然而本蒟蒻并不会treap 奉上sth神犇的模板: //bzoj3196 二逼平衡树,支持修改某个点的值,查询区间第k小值,查询区间某个值排 ...

  7. POJ 3468:A Simple Problem with Integers(线段树区间更新模板)

    A Simple Problem with Integers Time Limit: 5000MS   Memory Limit: 131072K Total Submissions: 141093 ...

  8. bzoj 2124 等差子序列 (线段树维护hash)

    2124: 等差子序列 Time Limit: 3 Sec  Memory Limit: 259 MBSubmit: 1922  Solved: 714[Submit][Status][Discuss ...

  9. 【luogu P3372 线段树1】 模板

    线段树的模板题 题目链接:https://www.luogu.org/problemnew/show/P3372 update区间修改,query区间求和 #include <iostream& ...

  10. 【线段树 集合hash】bzoj4373: 算术天才⑨与等差数列

    hash大法好(@ARZhu):大数相乘及时取模真的是件麻烦事情 Description 算术天才⑨非常喜欢和等差数列玩耍.有一天,他给了你一个长度为n的序列,其中第i个数为a[i].他想考考你,每次 ...

随机推荐

  1. Codeforces Round #422 (Div. 2)D. My pretty girl Noora(递推+数论)

    传送门 题意 对于n个女孩,每次分成x人/组,每组比较次数为\(\frac{x(x+1)}{2}\),直到剩余1人 计算\[\sum_{i=l}^{r}t^{i-l}f(i)\],其中f(i)代表i个 ...

  2. [转]Markdown语法参考

    << 访问 Wow!Ubuntu NOTE: This is Simplelified Chinese Edition Document of Markdown Syntax. If yo ...

  3. 【POJ - 2376】Cleaning Shifts(贪心)

    Cleaning Shifts Descriptions: 原文是English,我这就直接上Chinese了,想看原文的点一下链接哦 大表哥分配 N (1 <= N <= 25,000) ...

  4. Angular 项目开发中父子组件传参

    在项目开发中经常会遇到 组件之间传参的问题.今天总结下在使用angular的项目中父子组件传参的问题: 1.父组件向子组件传参: 然后在父组件中 然后在父组件的html中 然后就可以在子组件中使用了 ...

  5. 构造 Bubble Cup 8 - Finals D. Tablecity

    题目传送门 题意:在1000*2的格子里,在每个小时能派出两个警察在两个地点搜查小偷,求在2015小时内能抓住小偷的方案. 分析:首先每次扫过一列即i1 i2从左往右扫,这样会漏掉小偷正好从间隙穿过的 ...

  6. sql 语句操作,修改字段中字符串的一部分

    update 表名 set 字段=replace(字段,‘替换的部分’,‘替换后的字符串’): update 表名 set A=replace( A, '海淀', '朝阳') where A like ...

  7. h5-25-地理定位配合百度地图

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <meta name ...

  8. 在eclipse中配置Tomcat并将项目部署到Tomcat上

    参考:http://blog.csdn.net/yerenyuan_pku/article/details/51830104 首先在点击window窗口然后preferences 然后点击Add,选择 ...

  9. P2658 汽车拉力比赛

    题目描述 博艾市将要举行一场汽车拉力比赛. 赛场凹凸不平,所以被描述为M*N的网格来表示海拔高度(1≤ M,N ≤500),每个单元格的海拔范围在0到10^9之间. 其中一些单元格被定义为路标.组织者 ...

  10. bt设置指定的ip地址

    auto eth0 iface eth0 inet staticaddress 192.168.1.112 IP地址netmask 255.255.255.0 子网掩码network 192.168. ...