zoukankan      html  css  js  c++  java
  • 模板整合

    快读:

    inline int read() {    
        int i = 0, j = 1;
        char ch = getchar();
        while (ch<'0' || ch>'9') { if (ch == '-')j = -1; ch = getchar(); }
        while (ch >= '0'&&ch <= '9') i = i * 10 + ch - '0', ch = getchar();
        return i*j;
    }
    

     快排:

    #include <iostream>
    #include<algorithm>
    using namespace std;
    int  n, t, a[100010];
     
    void qsort(int l, int r)
    {
        int i = l, j = r;
        int mid = a[(l + r) >> 1];//基准数
        while (i <= j) {
            while (a[i] < mid)
                i++;
            while (a[j] > mid)
                j--;
            if (i <= j) {
                swap(a[i], a[j]);
                i++; j--;
            }
        }
        if (l < j)qsort(l, j);//递归左边
        if (r > i)qsort(i, r);//递归右边
        return;
    }
     
    int main()
    {
        ios::sync_with_stdio(0);
        cin.tie(0), cout.tie(0);
        cin >> n;
        for (int i = 0; i < n; i++)
            cin >> a[i];
        sort(a, a+n);
        for (int i = 0; i < n; i++)
            cout << a[i] << " ";
        return 0;
    }
    

     线性基:

    #include<iostream>
    #include<algorithm>
    using namespace std;
    #define ll long long
    ll a[100010], b[70];
    ll n, ans=0;
    int main()
    {
        cin >> n;
        for (int i = 0; i < n; i++)
            cin >> a[i];
        for (int i = 0; i <n; i++)
            for (int j = 62; j >= 0; j--)
                if (1ll << j & a[i])
                    if (!b[j]) {
                        b[j] = a[i];
                        break;
                    }
                    else
                        a[i] ^= b[j];
        for (int i = 62; i >= 0; i--)
            ans = max(ans, ans^b[i]);
        cout << ans << endl;
        return 0;
    }
    //c++ max函数头文件是#include<algorithm>
    

     DFS:

    int dx[] = { 0,1,0,-1 };
    int dy[] = { 1,0,-1,0 };
     
    void dfs()//参数用来表示状态
    {
        if (到达终点状态)
        {
            ...//根据题意来添加
                return;
        }
        if (越界或者是不符合法状态)
            return;
        for (扩展方式)//一般是四个方向扩展
        {
            if (扩展方式所达到状态合法)
            {
                ....//根据题意来添加
                    标记;
                    dfs();
                    修改(剪枝);
                    (还原标记);
                    //是否还原标记根据题意
                    //如果加上(还原标记)就是 回溯法
            }
     
        }
    }
    

     二分:

    No.1:最大的小值   1~9中最小的大于5的数

    int erf(int le, int ri) {//求满足条件的最大值
        while (le + 1 <ri) {//防止死循环
            int mid = le + ri >> 1;// '+'优先级大于'>>'
            if (check(mid))//check()函数:mid满足条件
                le = mid;
            else
                ri = mid;
        }
        return le;
    }
    

     No.2:最小的大值   1~9中最大的小于5的数

    int erf(int le, int ri) {//求满足条件的最小值
        while (le + 1 <ri) {//防止死循环
            int mid = le + ri >> 1;// '+'优先级大于'>>'
            if (check(mid))//check()函数:mid满足条件
                ri = mid;
            else
                le = mid;
        }
        return ri;
    }
    

     快速幂:

    #include<iostream>
    #include<algorithm>
    using namespace std;
    #define ll long long
    int qmi(ll a, ll b, ll mod) {   //求 a^b%p,时间复杂度 O(logn)
        ll flag = 1;
        while (b) {
            if (b & 1)flag = (flag*a)%mod;
            a = (a*a) % mod;
            b = b >> 1;
        }
        return flag%mod;
    }
     
    int qji(ll a, ll b, ll mod) {   //求 a*b%p,时间复杂度 O(logn)
        ll flag = 0;
        while (b) {
            if (b & 1)flag = (flag + a) % mod;
            a = (a << 1) % mod;
            b = b >> 1;
        }
        return flag%mod;
    }
     
    int main() {
        ll a, b, c;
        cin >> a >> b >> c;
        cout << a << "^" << b << " mod " << c << "=" << qmi(a, b, c) << "
    ";
        cout << a << "*" << b << " mod " << c << "=" << qji(a, b, c) << "
    ";
        return 0;
    }
    

     线性筛:

    #include<iostream>
    #include<algorithm>
    #include <cstring>
    #include<vector>
    #include<math.h>
    using namespace std;
    int su[10000010];//素数表,默认为0,值为0代表是素数,值为1代表不是素数
    bool out[10000010];//判断素数,默认为false 如果值为true,代表这个数不是质数
     
    void aishai(int mm) {           //埃式筛法      用时: 3761ms / 内存: 41580KB        一个测试点999ms
        su[0] = su[1] = 1;
        for (int i = 2; i <= sqrt(mm); i++) {
            if (su[i])continue;
            for (int j = i << 1; j <= mm; j += i)
                su[j] = 1;
        }
    }
         
    void olshai(int mm)         //欧拉筛法          用时: 1654ms / 内存: 18052KB
    {
        vector<int>cun;           //储存素数
        out[0]=out[1] = 1;      //0和1不是质数       没有,错一个测试点
        for (int i = 2; i <= mm; i++)
        {
            if (!out[i])cun.push_back(i);   //没被筛过,肯定是素数
            int len = cun.size();
            for (int j = 0; j < len&&i*cun[j] <= mm; j++) {       //<=mm 没有等于的话,错两个测试点
                out[i*cun[j]] = true;       //素数的倍数肯定不是素数
                if (i%cun[j] == 0)break;    //主要优化点,如果i是素数的倍数的话,就结束
            }
        }
        return;
    }
     
    bool issu(int a) {          //最快判断素数        用时: 842ms / 内存: 780KB
        if (a == 0 || a == 1)return 0;
        if (a == 2 || a == 3)return 1;
        if (a % 6 != 1 && a % 6 != 5) return 0;
        int qa = sqrt(a);
        for (int i = 5; i <= qa; i++)
            if (a%i == 0 || a % (i + 1) == 0)return 0;
        return 1;
    }
     
    int main() {
     
        ios::sync_with_stdio(0);
        cin.tie(0), cout.tie(0);
     
        int n, m,t;
        cin >> n>>m;
        //aishai(n);
        for (int i = 0; i < m; i++) {
            cin >> t;
            if (!issu(t))
                cout << "No
    ";
            else
                cout << "Yes
    ";
        }
        return 0;
    }  
    

     费马小定理:

    /*
    费马小定理: 假如p是质数,且gcd(a,p)=1,那么 a^(p-1)≡1(mod p) 两边都mod p;
    即:假如a是整数,p是质数,且a,p互质(即两者只有一个公约数1),那么a的(p-1)次方除以p的余数恒等于1。
    延伸:1. n*a^(p-1) ≡ n (mod p)
          2. a^(p-2) ≡ a^(-1)(mod p)
     正序逆序要灵活运用!
     
     (A/B)%mod => A%mod/B => n/B => n*B^(-1) => 延伸2 => n*(B^(mod-2))%mod
     
     */ 
     
     #include<iostream>
    #include<algorithm>
    using namespace std;
    #define ll long long
     
    int qmi(ll a, ll b, ll mod) {   //快速幂
        ll flag = 1;
        while (b) {
            if (b & 1)flag = (flag*a) % mod;
            a = (a*a) % mod;
            b = b >> 1;
        }
        return flag%mod;
    }
     
    int main() {
        int t, n, b,mod=10007;
        cin >> t;
        while (t--) {
            cin >> n >> b;
     
            cout << n*qmi(b, mod-2, mod) % mod << "
    ";
        }
        return 0;
    }
    

     KMP:

    #include<iostream>
    #include<string>
    #include<stdio.h>
    using namespace std;
    const int maxn = 1e6;
    string tex, pat;                                    //tex文本串  pat模式串
    int nex[maxn];
     
    void getnext(string pat, int lenpat) {              //获取nex数组
        int j = nex[0] = -1;                            //j相当于记录nex[i]的值
        for (int i = 1; i < lenpat; i++) {               //求next[1]~next[len-1]
            while (j != -1 && pat[i] != pat[j + 1]) {
                j = nex[j];                             //j回退,直到j回退到-1或pat[i]==pat[j+1]
            }
            if (pat[i] == pat[j+1])j++;                 //相等,先令j指向这个位置。
            nex[i] = j;                                 //赋值给nex[i]
        }
    }
     
    int kmp(string tex, string pat) {
        int lent = tex.size(), lenp = pat.size();
        getnext(pat,lenp);                                  //获取模式串的nex[]数组
        int cnt = 0, j = -1;                                //cnt:成功匹配次数
        for (int i = 0; i < lent; i++) {                 //试图匹配tex
        //  cout << "i=   " << i << endl;
            while (j != -1 && tex[i] != pat[j + 1]) {      
                j = nex[j];                                 //j回退,直到j回退到-1或pat[i]==pat[j+1]
            }
            if (tex[i] == pat[j + 1])
                j++;                                        //匹配的话,继续
            if (j == lenp-1)
                cout << i+2-lenp<< "
    ",cnt++, j = nex[j];          //i下标从零开始的,应该属输出 i+1-(lenp)+1
        }
        return cnt;
    }
     
    int main() {
        cin >> tex>>pat;
        int lenp = pat.size();
        kmp(tex, pat);
        for (int i = 0; i < lenp; i++)
            cout << nex[i]+1 << " ";
        return 0;
    }
    
  • 相关阅读:
    Shell编程------函数应用
    Shell编程------循环语句
    Shell编程------判断语句
    Shell编程------变量、赋值和运算
    Action实现prepareable接口后定义前置方法
    动态代理模式
    hibernate持久化对象,
    view视图总结
    servlet和Struts2的线程安全性对比
    Action获取请求参数的3中方式
  • 原文地址:https://www.cnblogs.com/52dxer/p/10540729.html
Copyright © 2011-2022 走看看