zoukankan      html  css  js  c++  java
  • 【模板】NOIP模板汇总

    图论

    数据结构

    数学

    其他:

    洛谷模板:a,b两个字符串,求b串在a串中出现的位置

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    using namespace std;
    char s1[1000009],s2[1001];
    int len1,len2,Next[1001];
    int main(){
        scanf("%s%s",s1+1,s2+1);
        len1=strlen(s1+1);len2=strlen(s2+1);
        for(int i=2,k=0;i<=len2;i++){
            for(;s2[i]!=s2[k+1]&&k>0;k=Next[k]);
            if(s2[i]==s2[k+1])Next[i]=++k;
        }
        for(int i=1,k=0;i<=len1;i++){
            for(;s1[i]!=s2[k+1]&&k>0;k=Next[k]);
            if(s1[i]==s2[k+1])++k;
            if(k==len2)printf("%d
    ",i-len2+1),k=Next[k];
        }
        for(int i=1;i<=len2;i++)printf("%d ",Next[i]);
        return 0;
    }
    KMP

    洛谷模板:n个字符串求有几个不同的串

    #include<iostream>
    #include<algorithm>
    #include<cstdio>
    #include<set> 
    #include<cstring>
    using namespace std;
    //#define mod 1e9+7//不能这样宏定义 
    const int mod=1e9+7;
    #define D 131
    #define M 2333+7
    long long n,g[M],f[M];
    string s;
    set<long long>t;
    void predeal(int x){
        f[0]=s[0];
        for(int i=1;i<=x;i++)
            f[i]=(1LL*f[i-1]*D+s[i-1])%mod;
        g[0]=1;
        for(int i=1;i<=x;i++)
            g[i]=1ll*g[i-1]*D%mod;
    }
    int Hash(int l,int r){
        long long a=f[r],b=1LL*f[l-1]*g[r-l+1]%mod;
        return (a-b+mod)%mod; 
    }
    int main()
    {
        scanf("%d",&n);
        for(int i=1;i<=n;i++){
            cin>>s;
            long long len=s.length();
            predeal(len);
            long long k=Hash(1,len);
            t.insert(k);
        }
        printf("%lld
    ",t.size());
        return 0;
    }
    hash

    洛谷模板:最长回文串

    #include<cstdio>
    #include<cstring>
    #include<iostream>
    using namespace std;
    const int maxn=1e7+5;
    char s[maxn*2],str[maxn*2];
    int Len[maxn*2],len;
    
    void getstr()
    {
        int k=0;
        str[k++]='$';
        for(int i=0;i<len;i++)
            str[k++]='#',
            str[k++]=s[i];
        str[k++]='#';
        len=k;
    }
    void Manacher()
    {
        getstr();
        int mx=0,id;
        for(int i=1;i<len;i++)
        {
            if(mx>i) Len[i]=min(Len[2*id-i],mx-i);
            else Len[i]=1;
            while(str[i+Len[i]]==str[i-Len[i]]) 
                Len[i]++;
            if(Len[i]+i>mx)
                mx=Len[i]+i,id=i;
        }
    }
    int main()
    {
            scanf("%s",&s);
            len=strlen(s);
            Manacher();
            int ans=1;
            for(int i=1;i<len;i++) ans=max(ans,Len[i]);
            printf("%d
    ",ans-1);
        return 0;
    }
    Manacher

    洛谷模板:快速排序

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    using namespace std;
    
    int n,a[100009],tmp[100009];
    
    void merge_sort(int l,int r){
        if(l==r)return;
        int mid=(l+r)>>1;
        merge_sort(l,mid);
        merge_sort(mid+1,r);
        int ii=l,jj=mid+1,k=l;
        while(ii<=mid&&jj<=r){
            if(a[ii]<a[jj])tmp[k++]=a[ii++];
            else tmp[k++]=a[jj++];
        }
        while(ii<=mid)tmp[k++]=a[ii++];
        while(jj<=r)tmp[k++]=a[jj++];
        for(int i=l;i<=r;i++)a[i]=tmp[i];
    }
    
    int main(){
        scanf("%d",&n);
        for(int i=1;i<=n;i++)scanf("%d",&a[i]);
        merge_sort(1,n);
        for(int i=1;i<=n;i++)cout<<a[i]<<" ";
        return 0;
    }
    归并排序

    洛谷模板:Lucas定理 

    给定n,m,p(1le n,m,ple 10^51n,m,p105)

    求C(n+m,m)

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #define LL long long
    using namespace std;
    
    int T;
    LL n,m,p,f[100009];
    
    void pre(){
        f[0]=1;
        for(int i=1;i<=p;i++)f[i]=f[i-1]*i%p;    
    }
    
    LL ksm(LL x,LL y){
        LL ret=1%p;
        while(y){
            if(y&1)ret=ret*x%p;
            x=x*x%p;
            y>>=1;
        }
        return ret;
    }
    
    LL C(LL n,LL m){
        if(m>n)return 0;//*******
        return f[n]*ksm(f[m],p-2)%p*ksm(f[n-m],p-2)%p;
    }
    
    LL Lucas(LL n,LL m){
        if(!m)return 1;
        return C(n%p,m%p)*Lucas(n/p,m/p)%p;
    }
    
    int main(){
        scanf("%d",&T);
        while(T--){
            scanf("%lld%lld%lld",&n,&m,&p);
            pre();
            printf("%lld
    ",Lucas(n+m,m)%p);
        }        
        return 0;
    }
    Lucas

    洛谷模板:ST表

    #include<iostream>
    #include<cstdio>
    #include<cmath>
    using namespace std;
    int f[200002][22];
    int n,m,a,b;
    int query(int l,int r){
        int k=log(r-l+1)/log(2);
        return max(f[l][k],f[r-(1<<k)+1][k]);
    }
    int main(){
        scanf("%d%d",&n,&m);
        for(int i=1;i<=n;i++)scanf("%d",&f[i][0]);
        for(int i=1;i<=20;i++)
            for(int j=1;j+(1<<i)-1<=n;j++)
               f[j][i]=max(f[j][i-1],f[j+(1<<(i-1))][i-1]);
        for(int i=1;i<=m;i++){
            scanf("%d%d",&a,&b);
            printf("%d
    ",query(a,b));
        }
    }
    ST

    洛谷模板:矩阵快速幂

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #define mod 1000000007
    using namespace std;
    int n;
    struct matrix{
        long long m[101][101];
    }A;
    matrix mul(matrix a,matrix b){
        matrix t;
        for(int i=1;i<=n;i++){
            for(int j=1;j<=n;j++){
                t.m[i][j]=0;
                for(int k=1;k<=n;k++){
                    t.m[i][j]=(t.m[i][j]+a.m[i][k]*b.m[k][j])%mod;
                }
            }
        }
        return t;
    }
    matrix fast_mul(matrix a,long long k){
        matrix ret=a,now=a;
        k--;
        while(k){
            if(k&1)ret=mul(ret,now);
            now=mul(now,now);
            k>>=1;
        }
        return ret;
    }
    long long k;
    int main(){
        scanf("%d%lld",&n,&k);
        for(int i=1;i<=n;i++)
         for(int j=1;j<=n;j++)
          scanf("%d",&A.m[i][j]);
        A=fast_mul(A,k);
        for(int i=1;i<=n;i++){
            for(int j=1;j<=n;j++)
            printf("%lld ",A.m[i][j]);
            printf("
    ");
        }
        return 0;
    }
    矩阵快速幂

    洛谷模板:乘法逆元

    #include<cstdio>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    #define MAXN 3000010
    using namespace std;
    int n,p;
    int inv[MAXN];
    int main(){
        scanf("%d%d",&n,&p);
        inv[1]=1;
        printf("1
    ");
        for(int i=2;i<=n;i++){
            inv[i]=(p-p/i)*1ll*inv[p%i]%p;
            printf("%d
    ",inv[i]);
        }
    }
    乘法逆元 线性
    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #define LL long long
    using namespace std;
    
    int n,p;
    
    LL ksm(LL x,LL y){
        int ret=1;
        while(y){
            if(y&1)ret=1LL*ret%p*x%p;
            x=x*x%p;
            y>>=1;
        }
        return ret%p;
    }
    
    int main(){
        scanf("%d%d",&n,&p);
        for(int i=1;i<=n;i++){
            printf("%lld
    ",ksm(i,p-2)%p);
        }
        return 0;
    }
    费马小定理
    #include<iostream>
    #include<cstdio>
    #include<cstring>
    using namespace std;
    
    int n,p;
    
    void exgcd(int a,int b,int &x,int &y){
        if(b==0){
            x=1;y=0;
            return;
        }
        exgcd(b,a%b,x,y);
        int t=x;x=y;y=t-a/b*y;
    }
    
    int main(){
        scanf("%d%d",&n,&p);
        for(register int i=1;i<=n;i++){
            int x,y;
            exgcd(i,p,x,y);
            printf("%d
    ",(x+p)%p);
        }
        return 0;
    }
    扩展欧几里得

    后两个在洛谷T一个点

    莫队

    树链剖分

    经典算法:

    贪心 

    动态规划

    希望看到有漏下的重要考点能够提出来

    感谢

  • 相关阅读:
    2021-4-1 日报博客
    2021-3-31 日报博客
    2021-3-30 日报博客
    2021-3-29 日报博客
    2021-3-27 周报博客
    java
    周末总结六
    java
    java
    java
  • 原文地址:https://www.cnblogs.com/zzyh/p/7800547.html
Copyright © 2011-2022 走看看