Submission #1288216

#TimeUsernameProblemLanguageResultExecution timeMemory
1288216LmaoLmaoMatching (CEOI11_mat)C++20
100 / 100
352 ms62248 KiB
#include <bits/stdc++.h>
#define int long long
#define fi first
#define se second
#define name "MOHINHGIA"
using namespace std;

using ii = pair<signed,signed>;
using aa = array<int,4>;
const int N=1e6+5;
const int MOD=1e9+7;
const int base=1e6+7;

void add(int &a,int b) {
    a+=b;
    if(a<0) a+=MOD;
    if(a>=MOD) a-=MOD;
    //return a;
}
void mul(int &a,int b) {
    a*=b;
    a%=MOD;
}

int bp(int a,int b) {
    int res=1;
    while(b>0) {
        if(b&1) mul(res,a);
        mul(a,a);
        b>>=1;
    }
    return res;
}

struct SMT {
    int F[N*2];
    int a[N];
    void update(int pos,int val) {
        int x=-a[pos]+val;
        if(x<0) x+=MOD;
        a[pos]=val;
        for(int i=pos;i<N;i+=i & -i) {
            add(F[i],x);
        }
    }
    int GET(int pos) {
        int res=0;
        for(int i=pos;i>0;i-=i & -i) {
            add(res,F[i]);
        }
        return res;
    }
    int get(int l,int r)
    {
        return (GET(r)-GET(l-1)+MOD)%MOD;
    }
} S;

struct BIT {
    int F[N];
    void update(int pos,int val) {
        for(int i=pos;i<N;i+=i & -i) {
            F[i]+=val;
        }
    }
    int get(int pos) {
        int res=0;
        for(int i=pos;i>0;i-=i & -i) {
            res+=F[i];
        }
        return res;
    }

} F;

signed a[N];
ii nen[N];
signed mp[N];
int binpow[N];
int inv[N];
int pre[N];

signed main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL); cout.tie(NULL);
    int n,m;
    cin >> n >> m;
    int huyhau=0;
    binpow[0]=pre[0]=1;
    vector<ii> sigma;
    int sum=0;
    for(int i=1;i<=n;i++) {
        int x;
        cin >> x;
        mp[x]=i;
    }
    for(int i=1;i<=n;i++) {
        mul(huyhau,base);
        add(huyhau,mp[i]);
    }
    for(int i=1;i<=m;i++) {
        binpow[i]=binpow[i-1]*base%MOD;
        cin >> a[i];
        nen[i]={a[i],i};
    }
    inv[m]=bp(binpow[m],MOD-2);
    for(int i=m-1;i>=0;i--) {
        inv[i]=inv[i+1]*base%MOD;
    }
    vector<signed> ans;
    sort(nen+1,nen+1+m);
    if(m<n) {
        cout << 0;
        return 0;
    }
    for(int i=1;i<=m;i++) {
        a[nen[i].se]=i;
    }
    int cur=0;
    for(int i=1;i<=n;i++) {
        F.update(a[i],1);
    }
    for(int i=1;i<=n;i++) {
        cur=cur+F.get(a[i])*binpow[m-i];
        cur%=MOD;
        S.update(a[i],binpow[m-i]);
        //cout << cur << ' ';
    }
    //cout << endl;
    if(cur*inv[m-n]%MOD==huyhau) {
        ans.push_back(1);
    }
    for(int i=n+1;i<=m;i++) {
        if(a[i-n]!=m)add(cur,-S.get(a[i-n]+1,m));
        add(cur,(-F.get(a[i-n]))*binpow[m-(i-n)]%MOD);
        S.update(a[i-n],0);
        F.update(a[i-n],-1);

        S.update(a[i],binpow[m-i]);
        F.update(a[i],1);
        add(cur,F.get(a[i])*binpow[m-i]%MOD);
        if(a[i]!=m) add(cur,S.get(a[i]+1,m));

        cur%=MOD;
        if(cur*inv[m-i]%MOD==huyhau) ans.push_back(i-n+1);
    }
    cout << ans.size() << endl;
    for(int x:ans) cout << x << ' ';
    return 0;

}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...