Cod sursa(job #2272609)

Utilizator PredaBossPreda Andrei PredaBoss Data 30 octombrie 2018 13:59:44
Problema A+B Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.11 kb
#include <bits/stdc++.h>

using namespace std;
short elem[3][10005],vecin[3][10005];
vector<pair<int,int> >nod[10005],where[10005];
bitset<10005>ap,viz[3];
int n,val,counter;
void go_visit(int i,int j)
{
    int pos=elem[i][j];
    if(pos==val)
        return;
    if(viz[nod[pos][0].first][nod[pos][0].second])
        go_visit(nod[pos][1].first,nod[pos][1].second);
    else
        go_visit(nod[pos][0].first,nod[pos][0].second);
}
int main()
{
    ifstream fin("biperm.in");
    ofstream fout("biperm.out");
    fin>>n;
    for(int i=1;i<=2;i++) for(int j=1;j<=n;j++) fin>>elem[i][j] , where[elem[i][j]].push_back({i,j});
    for(int i=1;i<=n;i++)
    {
        if(elem[1][i]==elem[2][i]) continue;
        nod[elem[1][i]].push_back({2,i});
        nod[elem[2][i]].push_back({1,i});
    }
    counter=1;
    for(int i=1;i<=2;i++)
        for(int j=1;j<=n;j++)
        {
            if(viz[i][j] || nod[elem[i][j]].empty()) continue;
            viz[i][j]=1;
            val=elem[i][j];
            go_visit(2-i+1,j);
            counter*=2;
        }
    fout<<counter<<" ";
    return 0;
}