【模板汇总】一年OI一场空

想到哪个敲哪个,无顺序之分。

kmp

洛谷3375

#include<bits/stdc++.h>
using namespace std;
#define N 1000100
char a[N],b[N];
int n,m,fail[N];
int main()
{
    scanf("%s%s",b+1,a+1);
    n=strlen(a+1);
    for(int i=2,j=0;i<=n;i++)
    {
        while(j>0&&a[i]!=a[j+1])j=fail[j];
        if(a[i]==a[j+1])j++;
        fail[i]=j;
    }
    m=strlen(b+1);
    for(int i=1,j=0;i<=m;i++) 
    {
        while(j>0&&(j==n||b[i]!=a[j+1]))j=fail[j];
        if(b[i]==a[j+1])j++;
        if(j==n)
        {
            printf("%d\n",i-n+1);
            j=fail[j];
        }
    }
    for(int i=1;i<=n;i++)printf("%d ",fail[i]);
    return 0;
}

堆优化dijkstra

洛谷4779

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define mp make_pair
#define N 100100
typedef pair<ll,ll>pii;
ll n,m,s,cnt,ans;
ll d[N],vis[N],first[N];
struct email
{
    ll u,v,w;
    ll nxt;
}e[N*4];
inline void add(ll u,ll v,ll w)
{
    e[++cnt].nxt=first[u];first[u]=cnt;
    e[cnt].u=u;e[cnt].v=v;e[cnt].w=w;
}
priority_queue<pii>q;
void dijkstra(ll s)
{
    memset(vis,0,sizeof(vis));
    memset(d,0x3f,sizeof(d));
    d[s]=0;
    q.push(mp(-d[s],s));
    while(!q.empty())
    {
        pii x=q.top();q.pop();
        ll u=x.second,now=x.first;
        if(vis[u])continue;vis[u]=1;
        for(ll i=first[u];i;i=e[i].nxt)
        {
            ll v=e[i].v,w=e[i].w;
            if(d[v]>d[u]+w)
            {
                d[v]=d[u]+w;
                q.push(mp(-d[v],v));
            }
        }
    }
} 

int main()
{
    scanf("%lld%lld%lld",&n,&m,&s);
    for(ll i=1;i<=m;i++)
    {
        ll u,v,w;
        scanf("%lld%lld%lld",&u,&v,&w);
        add(u,v,w);
    }
    dijkstra(s); 
    for(ll i=1;i<=n;i++)printf("%lld ",d[i]);
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/NSD-email0820/p/9905831.html