Other_模板

来源:互联网 发布:湘雅大数据 编辑:程序博客网 时间:2024/05/29 15:54


1.Kmp

int next[2005];int lena;int lenb;void set_naxt()//子串的next数组{    int i=0,j=-1;    next[0]=-1;    while(i<lenb)    {        if(j==-1||b[i]==b[j])        {            i++; j++;            next[i]=j;        }        else        j=next[j];    }}int kmp(){    int i=0,j=0;    set_naxt();    while(i<lena)    {        if(j==-1||a[i]==b[j])        {            i++;j++;        }        else        j=next[j];        if(j==lenb)        return i-j+1;    }    return -1;}

2.归并排序

void mergesort(int l,int r)  {      int i,j,k,m;      if(l<r)      {          m=(r+l)>>1;          mergesort(l,m);          mergesort(m+1,r);          k=l;          for(i=l,j=m+1; i<=m&&j<=r;)          {              if(a[i]>a[j])              {                  b[k++]=a[j++];//cont+=m-(i-1);//相当于线性交换了这么多次              }              else b[k++]=a[i++];          }          while(i<=m)b[k++]=a[i++];          while(j<=r)b[k++]=a[j++];          for(i=l; i<=r; i++)a[i]=b[i];      }  }  

3.快速排序

void quicksort(int l,int r){    int i,j,tmp,t;    if(l>r)return ;    tmp=a[l];i=l,j=r;    while(i!=j)    {        while(a[j]>=tmp&&i<j)j--;        while(a[i]<=tmp&&i<j)i++;        if(i<j)        {            t=a[i];a[i]=a[j];a[j]=t;        }    }    a[l]=a[i];    a[i]=tmp;    quicksort(l,i-1);    quicksort(i+1,r);}

4.set排序

#include<stdio.h>  #include<string.h>  #include<iostream>  #include<set>  #include<string>  using namespace std;  set<string >s;  int main()  {      string a;      while(getline(cin,a))      {          for(int i=0; i<a.size(); i++)          {              string tmp;              if(!isalpha(a[i]))continue;              while(isalpha(a[i]))              {                  if(a[i]>='A'&&a[i]<='Z')                  tmp+=a[i]+32;                  else tmp+=a[i];                  i++;              }              s.insert(tmp);          }      }      for(set<string>::iterator it=s.begin(); it!=s.end(); it++)      {          cout<<*it<<endl;      }  }  

5.Hash&&Hashmap

void Hash(char s[],ll len){    h[0]=0;x[0]=1;    for(ll i=1;i<=len;i++){        x[i]=x[i-1]*29;        h[i]=h[i-1]+x[i]*(s[i]-'a');    }}bool judge(ll l,ll r,ll l2,ll r2){    if(r-l != r2-l2) return false;    if( (h[r]-h[l-1])*(x[l2-l]) == (h[r2]-h[l2-1]) )        return true;    return false;}

const int maxn=100000;  const int hashh=1000007;  struct hashmap{    ll a[maxn];    int head[hash];    int next[maxn];    int size;    void init()    {        memset(head,-1,sizeof(head));        size=0;    }    bool find(ll val)    {        int tmp=(val%hash+hash)%hash;        for(int i=head[tmp];i!=-1;i=next[i])        {            if(val==a[i])return true;        }        return false;    }    void add(ll val)    {        int tmp=(val%hash+hash)%hash;        if(find(val))return ;        a[size]=val;        next[size]=head[tmp];//令next指向-1、        head[tmp]=size++;    }}h1,h2;

6.矩阵快速幂

#include<stdio.h>  #include<iostream>  #include<string.h>  using namespace std;  #define mod 10000  typedef struct Matrix  {      int mat[2][2];  }matrix;  matrix A,B;  Matrix matrix_mul(matrix a,matrix b){      matrix c;      memset(c.mat,0,sizeof(c.mat));      int i,j,k;      for(int i=0;i<2;i++)      {          for(int j=0;j<2;j++)          {              for(int k=0;k<2;k++)              {                  c.mat[i][j]+=a.mat[i][k]*b.mat[k][j];                  c.mat[i][j]%=mod;              }          }      }      return c;  }  Matrix matrix_quick_power(matrix a,int k){      matrix b;      memset(b.mat,0,sizeof(b.mat));      for(int i=0;i<2;i++)      b.mat[i][i]=1;//单位矩阵b      while(k)      {          if(k%2==1)          {              b=matrix_mul(a,b);              k-=1;          }          else          {              a=matrix_mul(a,a);              k/=2;          }      }      return b;  }  


矩阵快速幂+黑科技优化矩阵相乘

#include<stdio.h>#include<iostream>#include<string.h>using namespace std;#define ll __int64ll mod=1000000007;ll n,m;typedef struct Matrix{    ll mat[101][101];}matrix;matrix A,B;Matrix matrix_mul(matrix a,matrix b){    matrix c;    memset(c.mat,0,sizeof(c.mat));    int i,j,k;    for(int i=0;i<n;i++)    {        for(int k=0;k<n;k++)        {            if(a.mat[i][k]==0)continue;            for(int j=0;j<n;j++)            {                c.mat[i][j]=c.mat[i][j]+(a.mat[i][k]*b.mat[k][j])%mod;                c.mat[i][j]%=mod;            }        }    }    return c;}Matrix matrix_quick_power(matrix a,ll k)//矩阵快速幂0.0{    matrix b;    memset(b.mat,0,sizeof(b.mat));    for(int i=0;i<n;i++)    b.mat[i][i]=1;//单位矩阵b    while(k)    {        if(k%2==1)        {            b=matrix_mul(a,b);            k-=1;        }        else        {            a=matrix_mul(a,a);            k/=2;        }    }    return b;}int main(){    while(cin>>n>>m)    {        for(int i=0;i<n;i++)        {            for(int j=0;j<n;j++)            {                scanf("%I64d",&A.mat[i][j]);            }        }        B=matrix_quick_power(A,m);        for(int i=0;i<n;i++)        {            for(int j=0;j<n;j++)            {                printf("%I64d ",B.mat[i][j]%mod);            }            printf("\n");        }    }}

7.优先队列

struct zuobiao{    int x,y,output;    friend bool operator <(zuobiao a,zuobiao b)    {        return a.output>b.output;    }}now,nex;    priority_queue<zuobiao>s;struct cmp{    bool operator ()(int &a,int &b){        return a>b;//最小值优先    }};       priority_queue<int,vector<int>,cmp>s;//最小值优先

8.读入优化

#include<stdio.h>#include<string.h>using namespace std;int Scan(){int res = 0, ch, flag = 0;if((ch = getchar()) == '-')//判断正负flag = 1;else if(ch >= '0' && ch <= '9')//得到完整的数res = ch - '0';while((ch = getchar()) >= '0' && ch <= '9' )res = res * 10 + ch - '0';return flag ? -res : res;}int main(){    int n=Scan();    printf("%d\n",n);}

9.进制数取模

int judge(date &b){    int tmp=0;    for(int i=0;i<b.len;i++)    {        tmp=(tmp*c+b.a[i])%n;    }    return tmp;}


10.从Claris巨巨那里学来的O(1)快速积.看不懂的黑科技...............


#include<stdio.h>#include<string.h>#include<iostream>#include<math.h>using namespace std;#define ll __int64ll a,b,c,mod;ll kuaisucheng(ll a,ll b){    a%=mod;    b%=mod;    return (a*b-(ll)(a/(long double )mod*b+1e-8)*mod+mod)%mod;}int main(){    while(~scanf("%I64d%I64d%I64d",&a,&b,&c))    {        a%=c;        mod=c;        ll ans=1;        while(b)        {            if(b%2==1)            {                ans=kuaisucheng(ans,a)%mod;                b-=1;            }            a=kuaisucheng(a,a)%mod;            b/=2;        }        printf("%I64d\n",ans);    }}

11.Java A+B&&Java求斐波那契数列

import java.io.*;import java.util.*;import java.math.BigInteger;import java.util.Scanner;public class Main{    public static void main(String args[]) throws Exception    {        Scanner in = new Scanner(System.in);        while(in.hasNext())        {            BigInteger a, b;            a = in.nextBigInteger();            b = in.nextBigInteger();            System.out.println(a.add(b));        }    }}


import java.io.*;import java.util.*;import java.math.BigInteger;   public class Main{    public static void main(String args[]) throws Exception {        Scanner cin=new Scanner(System.in);        BigInteger[] f = new BigInteger[1200];        f[1]=BigInteger.valueOf(1);        f[2]=BigInteger.valueOf(2);        for(int i=3;i<=1100;i++)        {            f[i]=f[i-1].add(f[i-2]);        }        while (cin.hasNext()) {            int cont=0;            BigInteger l,r;            BigInteger Zero=BigInteger.valueOf(0);            l = cin.nextBigInteger();            r = cin.nextBigInteger();           if(l.compareTo(Zero)==0&&r.compareTo(Zero)==0)break;            for(int i=1;i<=1100;i++)            {                if(f[i].compareTo(l)>=0&&f[i].compareTo(r)<=0)cont++;            }            System.out.println(cont);        }    }}


12.转负二进制

Poj 3191#include<stdio.h>#include<string.h>#include<algorithm>using namespace std;int ans[1000];int main(){    int a;    while(~scanf("%d",&a))    {        if(a==0)        {            printf("0\n");            continue;        }        int cont=0;        while(a)        {            ans[cont++]=abs(a%(-2));            a-=abs(a%(-2));            a/=(-2);        }        for(int i=cont-1;i>=0;i--)printf("%d",ans[i]);        printf("\n");    }}

13.最小表示法


#include<stdio.h>  #include<string.h>  #include<iostream>  using namespace std;  char a[3004000];  char b[3004000];  int l;  int MinimumRepresentation()  {      int i = 0, j = 1, k = 0, t;      while(i < l && j < l && k < l) {          t = b[(i + k) >= l ? i + k - l : i + k] - b[(j + k) >= l ? j + k - l : j + k];          if(!t) k++;          else{              if(t > 0) i = i + k + 1;              else j = j + k + 1;              if(i == j) ++ j;              k = 0;          }      }      return (i < j ? i : j);  }  int main()  {      while(~scanf("%s",a))      {          int n=strlen(a);          l=n;          a[n]=a[0];          for(int i=0;i<n;i++)          {              if(a[i]<=a[i+1])              b[i]=a[i+1]-a[i];              else              b[i]=8-(a[i]-a[i+1]);          }          int tmp=MinimumRepresentation();          for(int z=0;z<n;z++)          {              printf("%d",b[(z+tmp)%n]);          }          printf("\n");      }  }  

14.set使用实例1+lower_bound(val)

#include<stdio.h>  #include<set>  #include<iostream>  #include<algorithm>  #include<string.h>  #include<map>  using namespace std;  int main()  {      int n;      while(~scanf("%d",&n))      {          map<int ,int>lson,rson;          set<int >s;          set<int >::iterator pos;          for(int i=0;i<n;i++)          {              int x;              scanf("%d",&x);              if(i==0)              {                  s.insert(x);                  continue;              }              pos=s.lower_bound(x);              if(pos!=s.end()&&lson[*pos]==0)              {                  lson[*pos]=x;              }              else              {                  pos--;                  rson[*pos]=x;              }              printf("%d ",*pos);              s.insert(x);          }          printf("\n");      }  }  

15.后缀模?

        cc[n-1]=(a[n-1]-'0')%c;          int tmp=1;          for(int i=n-2;i>=0;i--)          {              tmp=tmp*10%c;              cc[i]=(cc[i+1]+tmp*(a[i]-'0'))%c;          } 

16.01分数规划

当有求:Σ(a【i】)/Σ(b【i】)的最大(小)值的时候,我们可以将问题转化变成减法:

设定函数F(L)=Σ(a【i】)-L*Σ(b【i】);

若此时F(L)>=0,那么肯定有Σ(a【i】)-L*Σ(b【i】)>=0,那么就有:Σ(a【i】)/Σ(b【i】)>=L;

根据化出的等式可以得知,我们有比L更大。那么我们这里可以二分枚举这个L,同时也就是在二分枚举最终的答案。

若有F(L)>=0,我们要增大答案,相反减小答案即可。


17.离散化+Bfs实例 Fzu 2235

#include<stdio.h>#include<string.h>#include<algorithm>#include<queue>using namespace std;struct node{    int from;    int to;    int next;}e[105000*8];int cont;int head[105000];int dist[105000];int fx[8]={0,0,1,-1,-1,1,-1,1};int fy[8]={1,-1,0,0,-1,1,1,-1};pair<int ,int >p[105000];int cnt;int sx,sy,ex,ey;void add(int from,int to){    e[cont].to=to;    e[cont].next=head[from];    head[from]=cont++;}void SPFA(){    for(int i=1;i<=cnt;i++)dist[i]=0x3f3f3f3f;    int ss=lower_bound(p+1,p+1+cnt,make_pair(sx,sy))-p;    int tt=lower_bound(p+1,p+1+cnt,make_pair(ex,ey))-p;    dist[ss]=0;    queue<int>s;    s.push(ss);    while(!s.empty())    {        int u=s.front();        s.pop();        for(int i=head[u];i!=-1;i=e[i].next)        {            int v=e[i].to;            if(dist[v]>dist[u]+1)            {                dist[v]=dist[u]+1;                s.push(v);            }        }    }    if(dist[tt]==0x3f3f3f3f)printf("-1\n");    else printf("%d\n",dist[tt]);}int main(){    while(~scanf("%d%d%d%d",&sx,&sy,&ex,&ey))    {        cnt=0;        cont=0;        int tot;        scanf("%d",&tot);        memset(head,-1,sizeof(head));        for(int i=0;i<tot;i++)        {            int h,l,r;            scanf("%d%d%d",&h,&l,&r);            for(int j=l;j<=r;j++)            {                p[++cnt]=make_pair(h,j);            }        }        sort(p+1,p+cnt+1);        cnt=unique(p+1,p+cnt+1)-p-1;        for(int i=1;i<=cnt;i++)        {            for(int j=0;j<8;j++)            {                pair<int ,int >now=make_pair(p[i].first+fx[j],p[i].second+fy[j]);                int pos=lower_bound(p+1,p+cnt+1,now)-p;                if(p[pos].first==p[i].first+fx[j]&&p[pos].second==p[i].second+fy[j])                {                    add(i,pos);                }            }        }        SPFA();    }}

18.三分查找(int)


int Sanfen(int l,int r){    int lm,rm;    while(l<r-1)    {        lm=(l+r)/2;        rm=(lm+r)/2;        if(Slove(lm)>Slove(rm))        {            l=lm;        }        else r=rm;    }    return min(Slove(l),Slove(r));}