数据结构算法模板

〇    单调栈
 

stack<int>    stk;        //单调递增栈
void    insert(int x)
{
    while(!stk.empty() && stk.top() > x)
    stk.pop();
    stk.push(x);
}

 〇    单调队列
 

deque<int>    q;
void    insert(int x)
{
    while(!q.empty() && q.back() < x)
    q.pop_back();
    q.push_back(x);
}

〇    滑动窗口

〇    kmp算法
 

void    getnext(string &t)
{
    int    i = 0;k = -1;
    next[0] = -1;
    while(i < t.size())
    {
        if(k == -1 || t[i] = t[k])    next[++i] = ++k;
        else    k = next[k];
    }
}
int    kmp(string &s , string &t)
{
    int i = 0,j = 0;
    while(i < s.size() && j < (int)t.size())
    {
        if(j == -1 || s[i] = t[j])    i++,j++;
        else    j = next[j];
    }
    if(j == t.size())    return    i - j;
    else    return    -1;
}

〇    优化next数组

void getnextval(int nextval[],string &t)
{
    int    i = 0,k = -1;
    nexxtval[0] = -1;
    while(i < t.size() - 1)
    {
        if(k == -1 || t[k] == t[i])
        {
            if(t[++k] != t[++i])    nextval[i] = k;
            else    nextval[i] = nextval[k];
        }
        else    k = nextval[k];
    }
}

〇    寻找所有的模式串

vector<int>    getPrefix(string &t)
{
    int    m = t.size();
    vector<int>    Pi(m);
    for(int i = 1;i < m;i++)
    {
        int    k = Pi[i - 1];
        while(k && t[k] != t[i])    k = Pi[k - 1]
        if(t[k] == t[i])    k++;
        Pi[i] = k;
    }
    return    Pi;
}
vector<int>    kmp(string &s,string &t)
{
    int    n = s.size(),m = t.size();
    string    r = t + '#' + s;
    Pi[m] = getPrefix( t );
    vector<int>    res;
    for(int i = m + 1;i <= n + m;i++)
    if(Pi[i] == m)    res.push_back(i - 2 * m);
    return    res;
}

〇    寻找所有的模式串的kmp算法
 

vector<int>    getPrefix(string &t)
{
    int    m = t.size();
    vector<int>    Pi(m);
    for(int i = 1;i < m;i++)
    {
        int    k = Pi[i - 1];
        while(k && t[k] != t[i])    k = Pi[k - 1]
        if(t[k] == t[i])    k++;
        Pi[i] = k;
    }
    return    Pi;
}
vector<int>    kmp(string &s,string &t)
{
    int    n = s.size(),m = t.size();
    string    r = t + '#' + s;
    Pi[m] = getPrefix( t );
    vector<int>    res;
    for(int i = m + 1;i <= n + m;i++)
    if(Pi[i] == m)    res.push_back(i - 2 * m);
    return    res;
}

〇    并查集
 

int    find(int x)        //找到x所在集合
{
    if(p[x] != x)    p[x] = find(p[x]);
    return    p[x];
}
void    merge(int a,int b)        //合并两个集合
{
    int    pa = find(a);
    int    pb = find(b);
    if(pa != pb)
        p[pa] =    pb;
}
void    query(int a,int b)        //询问a,b是否在同一集合
{
    int    pa = find(a);
    int pb = find(b);
    if(pa == pb)    cout<<"YES"<<endl;
    else    cout<<"NO"<<endl;
}

〇    模拟堆
 

void    down(int u)
{
    int    t = u;
    if( 2*u <= idx && h[ 2*u ] < h[t] )    t = 2*u;
    if( 2*u + 1 <= idx && h[ 2*u + 1] < h[t]) t = 2*u + 1;
    if( u != t )    swap(h[u],h[t])
}
void    up(int u)
{
    while( u/2 && h[u/2] > h[u])
    {
        swap(h[u],h[u/2])
        u/2;
    }
}

欢迎订阅专栏,数据结构实验,期末大作业,前端后端,算法都有哦,想我发哪个方面的资源或文章可以私信我,免费的哦

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

然然超绝肌肉线条

你的鼓励将是创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值