模板......

//KMP算法:
void getnext()/*预处理部分匹配数组*/
{
    for(int i=1;i<len1;i++)
    {
        int j=f[i];
        while(j&&s1[i]!=s1[j]) j=f[j];
        f[i+1]= s1[i]==s1[j] ? j+1 : 0;
    }
}
void kmp()
{
    int j=0;
    for(int i=0;i<len2;i++)
    {
        while(j&&s1[j]!=s2[i]) j=f[j];
        if(s1[j]==s2[i]) j++;
        if(j==len1)
            /*每次匹配成功要做的事情*/
    }
    /*匹配成功后要做的事情*/ 
}
/*************************************/
//线段树:
struct node
{
    int l,r,w,f;
}tree[400001];
inline void build(int k,int ll,int rr)//建树 
{   //用法:build(节点编号,左孩子,右孩子); 
    //初始化:build(1,1,节点个数); 
    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)/2;
    build(k*2,ll,m);
    build(k*2+1,m+1,rr);
    tree[k].w=tree[k*2].w+tree[k*2+1].w;
}
inline void down(int k)//标记下传 
{   //用法:down(需要下传标记的根节点); 
    tree[k*2].f+=tree[k].f;
    tree[k*2+1].f+=tree[k].f;
    tree[k*2].w+=tree[k].f*(tree[k*2].r-tree[k*2].l+1);
    tree[k*2+1].w+=tree[k].f*(tree[k*2+1].r-tree[k*2+1].l+1);
    tree[k].f=0;
}
inline void ask_point(int k)//单点查询
{   //用法:ask_point(需要查询的点的编号); 
    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)/2;
    if(x<=m) ask_point(k*2);
    else ask_point(k*2+1);
}
inline void change_point(int k)//单点修改 
{   //用法:change_point(需要修改的点的编号); 
    if(tree[k].l==tree[k].r)
    {
        tree[k].w+=y;
        return;
    }
    int m=(tree[k].l+tree[k].r)/2;
    if(x<=m) change_point(k*2);
    else change_point(k*2+1);
    tree[k].w=tree[k*2].w+tree[k*2+1].w; 
}
inline void ask_interval(int k)//区间查询 
{   //用法:ask_iterval(查询起点); 
    if(tree[k].l>=a&&tree[k].r<=b)//a与b为需要查询的区间 
    {
        ans+=tree[k].w;
        return;
    }
    if(tree[k].f) down(k);
    int m=(tree[k].l+tree[k].r)/2;
    if(a<=m) ask_interval(k*2);
    if(b>m) ask_interval(k*2+1);
}
inline void change_interval(int k)//区间修改 
{   //用法:change_interval(修改起点); 
    if(tree[k].l>=a&&tree[k].r<=b)//a与b为需要修改的区间 
    {
        tree[k].w+=(tree[k].r-tree[k].l+1)*y;
        tree[k].f+=y;
        return;
    }
    if(tree[k].f) down(k);//若有孩子节点,下传标记 
    int m=(tree[k].l+tree[k].r)/2;//二分处理 
    if(a<=m) change_interval(k*2); 
    if(b>m) change_interval(k*2+1);
    tree[k].w=tree[k*2].w+tree[k*2+1].w;
}
/*************************************/
//哈希:
inline unsigned int BKDRHash(char *str)
{
    unsigned int seed = 131;//有冲突就多换几组种子或者多次哈希 
    unsigned int hash = 0;
    while (*str)
        hash = hash * seed + (*str++);
    return (hash & 0x7FFFFFFF);
}

线段树转自TRTTG:https://www.cnblogs.com/TheRoadToTheGold/p/6254255.html

posted @ 2017-05-09 21:57  baka  阅读(142)  评论(0)    收藏  举报