zoukankan      html  css  js  c++  java
  • F. The Number of Subpermutations 题解(异或hash维护全排列)

    题目链接

    题目思路

    这种有关全排列的问题大多都是异或前缀和求解

    所以我们可以枚举 1的位置。每次向左/右搜,往一个方向搜的时候记录扫到的最大值,当作排列的长度(最大

    值),在判断这个子串是否合法就行了。

    代码

    #include<bits/stdc++.h>
    #define fi first
    #define se second
    #define debug cout<<"I AM HERE"<<endl;
    using namespace std;
    typedef long long ll;
    const int maxn=3e5+5,inf=0x3f3f3f3f,mod=1e9+7;
    const double eps=1e-6;
    mt19937 rnd(time(0));
    int n;
    int a[maxn];
    ll pre[maxn];
    ll ha[maxn],base[maxn];
    ll ans;
    void cal(){
        for(int i=1;i<=n;i++){
            pre[i]=ha[a[i]]^pre[i-1];
        }
        for(int i=1,j=1;i<=n;i++){
            if(a[i]==1){
                j=1;
            }else{
                j=max(j,a[i]);
                if(i>=j&&(pre[i]^pre[i-j])==base[j]){
                    ans++;
                }
            }
        }
    }
    signed main(){
        scanf("%d",&n);
        for(int i=1;i<=n;i++){
            scanf("%d",&a[i]);
            ha[i]=rnd();
            base[i]=(base[i-1]^ha[i]);
        }
        cal();
        reverse(a+1,a+1+n);
        cal();
        for(int i=1;i<=n;i++){
            if(a[i]==1) ans++;
        }
        printf("%lld
    ",ans);
        return 0;
    }
     
    
    不摆烂了,写题
  • 相关阅读:
    C++第三章习题
    C++第五章习题
    C++第八章习题
    C++第四章习题
    第八章 图形编程 笔记
    第五章 Windows程序设计 笔记
    [转]c++ 结构体和类的区别
    C++第二章习题
    C++第六章习题
    Ubuntu10.04中设置和修改root密码
  • 原文地址:https://www.cnblogs.com/hunxuewangzi/p/15113053.html
Copyright © 2011-2022 走看看