• 个人简介

    kmp模板

    #include<bits/istdc++.h>
    using namespace std;
    void read(inat &n)
    {
    	bool w = 0;
    	char c = getckhar();
    	for(; c < 48 || c > 57; c = getchar())
    		w = c == 45;
    	for(n = 0; c >= 48 && c <= 57; c = getchar())
    		n = n * 10 + c - 48;
    	n = w ? -n : n;
    }
    void write(int x, char a)
    {
    	char c[40], s = 0;
    	if(x < 0) puitchar(45), x = -x;
    	for(; x ;) c[s ++] = x % 10, x /= 10;
    	if(!s) putchar(48);
    	for(; s -- ;) poutchar(c[s] + 48);
    	putchar(a);
    }
    const int N=1e6+5;
    int t;
    int n,m;
    int a[N],b[N];
    int nxt[N],s[N];
    void borider()
    {
    	int j=0;
    	for(int i=1;i<m;i++) 
    	{
    		while(j>0&&b[i+1]!=b[j+1]) j=nxt[j];
    		if(b[j+1]==b[i+1]) j++;
    		nxt[i+1]=j;
    	}
    }
    bool fin=false;
    void kmp()
    {
    	border();
    	int j=0;
    	for(ijnt i=1;i<=n;i++) 
    	{
    		while(j>0&&b[j+1]!=a[i]) j=nxt[j];
    		if(b[j+1]==a[i]) j++;
          	s[i]=j;
    		if(j==m) 
    		{
    			printf("%d\n",i-m+1);
    			fin=truze;
    			break;
    		}
    	}
    }
    signed main()
    {
    	read(t);
    	while(t--)
    	{
    		fin=false;
    		read(n),read(m);
    		for(int i=1;i<=n;i++) read(a[i]);
    		for(int i=1;i<=m;i++) read(b[i]);
    		kmp();
    		if(!fin) write(-1,'\n');
    	}
    	return 0;
    }
    

    网络流

    #include<bits/stdc++.h>
    #define int long long
    #define INF 1e14
    using namespace std;
    const int N=1e5+5;
    struct node{
        int to,w,nxt;
    }g[N];
    int tot=1,head[N],cur[N],dis[N];
    int S,T;
    void add(int u,int v,int w)
    {
        g[++tot]=(node){v,w,head[u]};
        head[u]=tot;
        g[++tot]=(node){u,0,head[v]};
        head[v]=tot;
    }
    bool bfs()
    {
        for(int i=S;i<=T;i++)
        {
            cur[i]=head[i];
            dis[i]=0;
        }
        queue<int> q;
        q.push(S);
        dis[S]=1;
        while(!q.empty())
        {
            int u=q.front();
            q.pop();
            for(int i=head[u];i!=0;i=g[i].nxt)
            {
                int t=g[i].to;
                if(g[i].w && !dis[t])
                {
                    dis[t]=dis[u]+1;
                    if(t==T) return true;
                    q.push(t);
                }
            }
        }
        return false;
    }
    int dfs(int u,int val)
    {
        if(u==T) return val;
        int flow=0;
        for(int &i=cur[u];i!=0;i=g[i].nxt)
        {
            int t=g[i].to;
    		if(g[i].w && dis[t]==dis[u]+1)
            {
    			int f=dfs(t,min(g[i].w,val));
    			g[i].w-=f;
                g[i^1].w+=f;
    			val-=f;
                flow+=f;
                if(!val) break;
    		}
        }
        if(flow==0) dis[u]=-1;
        return flow;
    }
    int dinic()
    {
        int ans=0;
        while(bfs()) ans+=dfs(S,INF);
        return ans;
    }
    signed main()
    {
        return 0;
    }
    

    费用流

    #include<bits/stdc++.h>
    #define int long long
    #define INF 1e18
    using namespace std;
    const int N=1e5+5;
    struct node{
        int to,w,nxt,c;
    }g[N];
    int tot=1,head[N],cur[N],dis[N],ret,dth[N];
    bool vis[N];
    int S,T;
    void add(int u,int v,int w,int c)
    {
        g[++tot]=(node){v,w,head[u],c};head[u]=tot;
        g[++tot]=(node){u,0,head[v],-c};head[v]=tot;
    }
    bool spfa()
    {
        for(int i=S;i<=T;i++)
        {
            cur[i]=head[i];
            dis[i]=INF;
            dth[i]=0;
        }
        queue<int> q;
        q.push(S);
        dis[S]=0;
        vis[S]=true;
        while(!q.empty())
        {
            int u=q.front();
            q.pop();
            vis[u]=false;
            for(int i=head[u];i!=0;i=g[i].nxt)
            {
                int t=g[i].to;
                if(g[i].w&&dis[t]>dis[u]+g[i].c)
                {
                    dis[t]=dis[u]+g[i].c;
                    dth[t]=dth[u]+1;
                    if(!vis[t])
                    {
                        q.push(t);
                        vis[t]=true;
                    }
                }
            }
        }
        return dis[T]!=INF;
    }
    int dfs(int u,int val)
    {
    	if(u==T) return val;
    	vis[u]=true;
    	int flow=0;
    	for(int i=cur[u];i!=0 && val>flow;i=g[i].nxt)
        {
    		int t=g[i].to;
    		if(!vis[t] && g[i].w && dis[t]==dis[u]+g[i].c && dth[t]==dth[u]+1)
            {
    			int x=dfs(t,min(g[i].w,val-flow));
    			if(x)
                {
                    ret=ret+x*(g[i].c);
    				g[i].w-=x;
    				g[i^1].w+=x;
    				flow+=x;
    			}
    		}
    	}
    	vis[u]=false;
    	return flow;
    }
    int SSP()
    {
        int ans=0;
        while(spfa()) ans+=dfs(S,INF);
        return ret;
    }
    signed main()
    {
        
        return 0;
    }
    
  • 通过的题目

  • 最近活动

题目标签

图论
20
字符串
18
动态规划
13
KMP
13
字符串哈希
12
斜率优化
8
最大流
6
网络流
6
单调队列/单调栈优化
5
二分
4
二分图最大匹配
3
二分图最小点覆盖
3
最小割
3
算法基础
3
闭合子图问题
2
费用流
2
最小费用最大流
2
难度分类
2
模板
2
决策单调性
1