Other_模板


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 __int64
ll 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 __int64
ll 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));
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值