제출 #1367800

#제출 시각아이디문제언어결과실행 시간메모리
1367800AvianshMars (APIO22_mars)C++20
100 / 100
453 ms5560 KiB
#include "mars.h"
#include <bits/stdc++.h>

using namespace std;

vector<vector<array<int,2>>> reqs(int n){
    n*=2;
    n++;
    n-=8;
    vector<int>temp;
    for(int i = 0;i<n;i++){
        if(i%((n+3)/4)==0||i==n-1){
            temp.push_back(i);
        }
    }
    vector<vector<array<int,2>>>ans;
    for(int i : temp){
        vector<array<int,2>>cur;
        for(int j : temp){
            cur.push_back({i,j});
        }
        ans.push_back(cur);
    }
    return ans;
}

string process(vector<vector<string>> a, int i, int j, int k, int n) {
    int curlen = 2*k+3;
    int cntshift = max(0,curlen-11);
    int prevlen = min(9,curlen-2);
    if(k<n-2){
        //routing phase
        if(curlen<=9){
            //still making 9x9s for each
            char grid[curlen][curlen];
            bool vis[curlen][curlen];
            for(int i = 0;i<curlen;i++){
                for(int j = 0;j<curlen;j++){
                    vis[i][j]=0;
                }
            }
            //current grid made now extend to curlen
            ///fill using all in order to account for corner(literally) cases
            for(int i = 0;i<3;i++){
                for(int j = 0;j<3;j++){
                    for(int curi = 0;curi<prevlen;curi++){
                        for(int curj = 0;curj<prevlen;curj++){
                            int x = curi+i;
                            int y = curj+j;
                            if(!vis[x][y]){
                                vis[x][y]=1;
                                grid[x][y]=(a[i][j][curi*prevlen+curj]=='1');
                            }
                        }
                    }
                }
            }
            string ret(100,'0');
            int ind = 0;
            for(int i = 0;i<curlen;i++){
                for(int j = 0;j<curlen;j++){
                    ret[ind++]=(grid[i][j] ? '1' : '0');
                }
            }
            return ret;
        }
        else{
            //exact 9x9s made for all
            //now must put them in correct place
            if(i==0&&j==0){
                return a[0][0];
            }
            vector<vector<array<int,2>>>tars = reqs(n);
            for(int x = 0;x<tars.size();x++){
                for(int y = 0;y<tars.size();y++){
                    array<int,2>pay = tars[x][y];
                    array<int,2>curr = {max(x,pay[0]-cntshift),max(y,pay[1]-cntshift)};
                    cntshift+=2;
                    array<int,2>nx = {max(x,pay[0]-cntshift),max(y,pay[1]-cntshift)};
                    cntshift-=2;
                    if(nx==(array<int,2>){i,j}){
                        //next position of this one is here
                        array<int,2>h = {curr[0]-i,curr[1]-j};
                        if(max(h[0],h[1])<=2&&min(h[0],h[1])>=0){
                            //possible
                            return a[h[0]][h[1]];
                        }
                    }
                }
            }
        }
    }
    else if(k==n-2){
        //second last phase. all bits should be where they need to be
        int len = n*2+1;
        vector<vector<array<int,2>>>pos;
        if(len>=14){
            //figure out using function
            pos=reqs(n);
        }
        else{
            for(int i = 0;i<5;i++){
                vector<array<int,2>>cur;
                for(int j = 0;j<5;j++){
                    cur.push_back({i,j});
                }
                pos.push_back(cur);
            }
        }
        //pos has all the inds now must do the REAL thingy
        if(i%2||j%2){
            //odd not required.
            return string(100,'0');
        }
        bool grid[len][len];
        for(int i = 0;i<len;i++){
            for(int j = 0;j<len;j++){
                grid[i][j]=0;
            }
        }
        if(i==0&&j==0){
            //top left
            int quadlen = (len+1)/2;
            for(int x = 0;x<pos.size();x++){
                for(int y = 0;y<pos.size();y++){
                    array<int,2>pay = pos[x][y];
                    array<int,2>curr = {max(x,pay[0]-cntshift),max(y,pay[1]-cntshift)};
                    curr = {curr[0]-i,curr[1]-j};
                    if(max(curr[0],curr[1])<=2&&min(curr[0],curr[1])>=0){
                        //in range so include
                        for(int i = 0;i<prevlen;i++){
                            for(int j = 0;j<prevlen;j++){
                                if(max(i+pay[0],j+pay[1])<quadlen)
                                    grid[i+pay[0]][j+pay[1]]=(a[curr[0]][curr[1]][i*prevlen+j]=='1');
                            }
                        }
                    }
                }
            }
            //grid made
            int group[len][len];
            for(int i = 0;i<len;i++){
                for(int j = 0;j<len;j++){
                    group[i][j]=-1;
                }
            }
            int cr = 0;
            for(int i = 0;i<quadlen;i++){
                for(int j = quadlen-1;j>=0;j--){
                    if(i==quadlen-1||j==quadlen-1){
                        if(grid[i][j]&&group[i][j]==-1){
                            //ungrouped
                            group[i][j]=cr++;
                            queue<array<int,2>>q;
                            q.push({i,j});
                            while(!q.empty()){
                                auto [x,y] = q.front();
                                q.pop();
                                if(x-1>=0&&grid[x-1][y]&&group[x-1][y]==-1){
                                    group[x-1][y]=group[x][y];
                                    q.push({x-1,y});
                                }
                                if(x+1<len&&grid[x+1][y]&&group[x+1][y]==-1){
                                    group[x+1][y]=group[x][y];
                                    q.push({x+1,y});
                                }
                                if(y-1>=0&&grid[x][y-1]&&group[x][y-1]==-1){
                                    group[x][y-1]=group[x][y];
                                    q.push({x,y-1});
                                }
                                if(y+1<len&&grid[x][y+1]&&group[x][y+1]==-1){
                                    group[x][y+1]=group[x][y];
                                    q.push({x,y+1});
                                }
                            }
                        }
                    }
                }
            }
            //all have been grouped.
            //count internal
            int internal = 0;
            for(int i = 0;i<quadlen;i++){
                for(int j = 0;j<quadlen;j++){
                    if(group[i][j]==-1&&grid[i][j]){
                        internal++;
                        group[i][j]=cr++;
                        queue<array<int,2>>q;
                        q.push({i,j});
                        while(!q.empty()){
                            auto [x,y] = q.front();
                            q.pop();
                            if(x-1>=0&&grid[x-1][y]&&group[x-1][y]==-1){
                                group[x-1][y]=group[x][y];
                                q.push({x-1,y});
                            }
                            if(x+1<len&&grid[x+1][y]&&group[x+1][y]==-1){
                                group[x+1][y]=group[x][y];
                                q.push({x+1,y});
                            }
                            if(y-1>=0&&grid[x][y-1]&&group[x][y-1]==-1){
                                group[x][y-1]=group[x][y];
                                q.push({x,y-1});
                            }
                            if(y+1<len&&grid[x][y+1]&&group[x][y+1]==-1){
                                group[x][y+1]=group[x][y];
                                q.push({x,y+1});
                            }
                        }
                    }
                }
            }
            string mask = "";
            string F = "";
            string B = "";
            map<int,int>last;
            bool ne = 0;
            for(int i = 0;i<quadlen;i++){
                for(int j = quadlen-1;j>=0;j--){
                    if(i==quadlen-1||j==quadlen-1){
                        if(grid[i][j]){
                            mask+="1";
                            if(!ne){
                                if(last.find(group[i][j])==last.end()){
                                    //new
                                    last[group[i][j]]=F.size();
                                    F+="1";
                                    B+="0";
                                }
                                else{
                                    last[group[i][j]]=F.size();
                                    F+="0";
                                    B+="0";
                                }
                            }
                            ne=1;
                        }
                        else{
                            mask+="0";
                            ne=0;
                        }
                    }
                }
            }
            for(pair<int,int>p:last){
                B[p.second]='1';
            }
            while(mask.size()<41){
                mask+="0";
            }
            while(F.size()<21){
                F+="1";
            }
            while(B.size()<21){
                B+="1";
            }
            string inter(10,'0');
            for(int i = 0;i<10;i++){
                if((1<<i)&internal){
                    inter[i]='1';
                }
            }
            return inter+mask+F+B+string(7,'0');
        }
        else if(i==0&&j==2){
            //top right
            int quadlen = (len+1)/2;
            for(int x = 0;x<pos.size();x++){
                for(int y = 0;y<pos.size();y++){
                    array<int,2>pay = pos[x][y];
                    array<int,2>curr = {max(x,pay[0]-cntshift),max(y,pay[1]-cntshift)};
                    curr = {curr[0]-i,curr[1]-j};
                    if(max(curr[0],curr[1])<=2&&min(curr[0],curr[1])>=0){
                        //in range so include
                        for(int i = 0;i<prevlen;i++){
                            for(int j = 0;j<prevlen;j++){
                                if(i+pay[0]<quadlen&&j+pay[1]>=quadlen-1)
                                    grid[i+pay[0]][j+pay[1]]=(a[curr[0]][curr[1]][i*prevlen+j]=='1');
                            }
                        }
                    }
                }
            }
            //grid made
            int group[len][len];
            for(int i = 0;i<len;i++){
                for(int j = 0;j<len;j++){
                    group[i][j]=-1;
                }
            }
            int cr = 0;
            for(int i = 0;i<len;i++){
                for(int j = 0;j<len;j++){
                    if(i==quadlen-1||j==quadlen-1){
                        if(grid[i][j]&&group[i][j]==-1){
                            //ungrouped
                            group[i][j]=cr++;
                            queue<array<int,2>>q;
                            q.push({i,j});
                            while(!q.empty()){
                                auto [x,y] = q.front();
                                q.pop();
                                if(x-1>=0&&grid[x-1][y]&&group[x-1][y]==-1){
                                    group[x-1][y]=group[x][y];
                                    q.push({x-1,y});
                                }
                                if(x+1<len&&grid[x+1][y]&&group[x+1][y]==-1){
                                    group[x+1][y]=group[x][y];
                                    q.push({x+1,y});
                                }
                                if(y-1>=0&&grid[x][y-1]&&group[x][y-1]==-1){
                                    group[x][y-1]=group[x][y];
                                    q.push({x,y-1});
                                }
                                if(y+1<len&&grid[x][y+1]&&group[x][y+1]==-1){
                                    group[x][y+1]=group[x][y];
                                    q.push({x,y+1});
                                }
                            }
                        }
                    }
                }
            }
            //all have been grouped.
            //count internal
            int internal = 0;
            for(int i = 0;i<quadlen;i++){
                for(int j = quadlen-1;j<len;j++){
                    if(group[i][j]==-1&&grid[i][j]){
                        internal++;
                        group[i][j]=cr++;
                        queue<array<int,2>>q;
                        q.push({i,j});
                        while(!q.empty()){
                            auto [x,y] = q.front();
                            q.pop();
                            if(x-1>=0&&grid[x-1][y]&&group[x-1][y]==-1){
                                group[x-1][y]=group[x][y];
                                q.push({x-1,y});
                            }
                            if(x+1<len&&grid[x+1][y]&&group[x+1][y]==-1){
                                group[x+1][y]=group[x][y];
                                q.push({x+1,y});
                            }
                            if(y-1>=0&&grid[x][y-1]&&group[x][y-1]==-1){
                                group[x][y-1]=group[x][y];
                                q.push({x,y-1});
                            }
                            if(y+1<len&&grid[x][y+1]&&group[x][y+1]==-1){
                                group[x][y+1]=group[x][y];
                                q.push({x,y+1});
                            }
                        }
                    }
                }
            }
            string mask = "";
            string F = "";
            string B = "";
            map<int,int>last;
            bool ne = 0;
            for(int i = 0;i<quadlen;i++){
                for(int j = quadlen-1;j<len;j++){
                    if(i==quadlen-1||j==quadlen-1){
                        if(grid[i][j]){
                            mask+="1";
                            if(!ne){
                                if(last.find(group[i][j])==last.end()){
                                    //new
                                    last[group[i][j]]=F.size();
                                    F+="1";
                                    B+="0";
                                }
                                else{
                                    last[group[i][j]]=F.size();
                                    F+="0";
                                    B+="0";
                                }
                            }
                            ne=1;
                        }
                        else{
                            mask+="0";
                            ne=0;
                        }
                    }
                }
            }
            for(pair<int,int>p:last){
                B[p.second]='1';
            }
            while(mask.size()<41){
                mask+="0";
            }
            while(F.size()<21){
                F+="1";
            }
            while(B.size()<21){
                B+="1";
            }
            string inter(10,'0');
            for(int i = 0;i<10;i++){
                if((1<<i)&internal){
                    inter[i]='1';
                }
            }
            return inter+mask+F+B+string(7,'0');
        }
        else if(j==0&&i==2){
            //bottom left
            int quadlen = (len+1)/2;
            for(int x = 0;x<pos.size();x++){
                for(int y = 0;y<pos.size();y++){
                    array<int,2>pay = pos[x][y];
                    array<int,2>curr = {max(x,pay[0]-cntshift),max(y,pay[1]-cntshift)};
                    curr = {curr[0]-i,curr[1]-j};
                    if(max(curr[0],curr[1])<=2&&min(curr[0],curr[1])>=0){
                        //in range so include
                        for(int i = 0;i<prevlen;i++){
                            for(int j = 0;j<prevlen;j++){
                                if(i+pay[0]>=quadlen-1&&j+pay[1]<quadlen)
                                    grid[i+pay[0]][j+pay[1]]=(a[curr[0]][curr[1]][i*prevlen+j]=='1');
                            }
                        }
                    }
                }
            }
            //grid made
            int group[len][len];
            for(int i = 0;i<len;i++){
                for(int j = 0;j<len;j++){
                    group[i][j]=-1;
                }
            }
            int cr = 0;
            for(int i = 0;i<len;i++){
                for(int j = 0;j<len;j++){
                    if(i==quadlen-1||j==quadlen-1){
                        if(grid[i][j]&&group[i][j]==-1){
                            //ungrouped
                            group[i][j]=cr++;
                            queue<array<int,2>>q;
                            q.push({i,j});
                            while(!q.empty()){
                                auto [x,y] = q.front();
                                q.pop();
                                if(x-1>=0&&grid[x-1][y]&&group[x-1][y]==-1){
                                    group[x-1][y]=group[x][y];
                                    q.push({x-1,y});
                                }
                                if(x+1<len&&grid[x+1][y]&&group[x+1][y]==-1){
                                    group[x+1][y]=group[x][y];
                                    q.push({x+1,y});
                                }
                                if(y-1>=0&&grid[x][y-1]&&group[x][y-1]==-1){
                                    group[x][y-1]=group[x][y];
                                    q.push({x,y-1});
                                }
                                if(y+1<len&&grid[x][y+1]&&group[x][y+1]==-1){
                                    group[x][y+1]=group[x][y];
                                    q.push({x,y+1});
                                }
                            }
                        }
                    }
                }
            }
            //all have been grouped.
            //count internal
            int internal = 0;
            for(int i = quadlen-1;i<len;i++){
                for(int j = 0;j<quadlen;j++){
                    if(group[i][j]==-1&&grid[i][j]){
                        internal++;
                        group[i][j]=cr++;
                        queue<array<int,2>>q;
                        q.push({i,j});
                        while(!q.empty()){
                            auto [x,y] = q.front();
                            q.pop();
                            if(x-1>=0&&grid[x-1][y]&&group[x-1][y]==-1){
                                group[x-1][y]=group[x][y];
                                q.push({x-1,y});
                            }
                            if(x+1<len&&grid[x+1][y]&&group[x+1][y]==-1){
                                group[x+1][y]=group[x][y];
                                q.push({x+1,y});
                            }
                            if(y-1>=0&&grid[x][y-1]&&group[x][y-1]==-1){
                                group[x][y-1]=group[x][y];
                                q.push({x,y-1});
                            }
                            if(y+1<len&&grid[x][y+1]&&group[x][y+1]==-1){
                                group[x][y+1]=group[x][y];
                                q.push({x,y+1});
                            }
                        }
                    }
                }
            }
            string mask = "";
            string F = "";
            string B = "";
            map<int,int>last;
            bool ne = 0;
            for(int i = quadlen-1;i<len;i++){
                for(int j = 0;j<quadlen;j++){
                    if(i==quadlen-1||j==quadlen-1){
                        if(grid[i][j]){
                            mask+="1";
                            if(!ne){
                                if(last.find(group[i][j])==last.end()){
                                    //new
                                    last[group[i][j]]=F.size();
                                    F+="1";
                                    B+="0";
                                }
                                else{
                                    last[group[i][j]]=F.size();
                                    F+="0";
                                    B+="0";
                                }
                            }
                            ne=1;
                        }
                        else{
                            mask+="0";
                            ne=0;
                        }
                    }
                }
            }
            for(pair<int,int>p:last){
                B[p.second]='1';
            }
            while(mask.size()<41){
                mask+="0";
            }
            while(F.size()<21){
                F+="1";
            }
            while(B.size()<21){
                B+="1";
            }
            string inter(10,'0');
            for(int i = 0;i<10;i++){
                if((1<<i)&internal){
                    inter[i]='1';
                }
            }
            return inter+mask+F+B+string(7,'0');
        }
        else{
            //i=2,j=2
            //bottom right
            int quadlen = (len+1)/2;
            for(int x = 0;x<pos.size();x++){
                for(int y = 0;y<pos.size();y++){
                    array<int,2>pay = pos[x][y];
                    array<int,2>curr = {max(x,pay[0]-cntshift),max(y,pay[1]-cntshift)};
                    curr = {curr[0]-i,curr[1]-j};
                    if(max(curr[0],curr[1])<=2&&min(curr[0],curr[1])>=0){
                        //in range so include
                        for(int i = 0;i<prevlen;i++){
                            for(int j = 0;j<prevlen;j++){
                                if(i+pay[0]>=quadlen-1&&j+pay[1]>=quadlen-1)
                                    grid[i+pay[0]][j+pay[1]]=(a[curr[0]][curr[1]][i*prevlen+j]=='1');
                            }
                        }
                    }
                }
            }
            //grid made
            int group[len][len];
            for(int i = 0;i<len;i++){
                for(int j = 0;j<len;j++){
                    group[i][j]=-1;
                }
            }
            int cr = 0;
            for(int i = 0;i<len;i++){
                for(int j = len-1;j>=0;j--){
                    if(i==quadlen-1||j==quadlen-1){
                        if(grid[i][j]&&group[i][j]==-1){
                            //ungrouped
                            group[i][j]=cr++;
                            queue<array<int,2>>q;
                            q.push({i,j});
                            while(!q.empty()){
                                auto [x,y] = q.front();
                                q.pop();
                                if(x-1>=0&&grid[x-1][y]&&group[x-1][y]==-1){
                                    group[x-1][y]=group[x][y];
                                    q.push({x-1,y});
                                }
                                if(x+1<len&&grid[x+1][y]&&group[x+1][y]==-1){
                                    group[x+1][y]=group[x][y];
                                    q.push({x+1,y});
                                }
                                if(y-1>=0&&grid[x][y-1]&&group[x][y-1]==-1){
                                    group[x][y-1]=group[x][y];
                                    q.push({x,y-1});
                                }
                                if(y+1<len&&grid[x][y+1]&&group[x][y+1]==-1){
                                    group[x][y+1]=group[x][y];
                                    q.push({x,y+1});
                                }
                            }
                        }
                    }
                }
            }
            //all have been grouped.
            //count internal
            int internal = 0;
            for(int i = quadlen-1;i<len;i++){
                for(int j = len-1;j>=quadlen-1;j--){
                    if(group[i][j]==-1&&grid[i][j]){
                        internal++;
                        group[i][j]=cr++;
                        queue<array<int,2>>q;
                        q.push({i,j});
                        while(!q.empty()){
                            auto [x,y] = q.front();
                            q.pop();
                            if(x-1>=0&&grid[x-1][y]&&group[x-1][y]==-1){
                                group[x-1][y]=group[x][y];
                                q.push({x-1,y});
                            }
                            if(x+1<len&&grid[x+1][y]&&group[x+1][y]==-1){
                                group[x+1][y]=group[x][y];
                                q.push({x+1,y});
                            }
                            if(y-1>=0&&grid[x][y-1]&&group[x][y-1]==-1){
                                group[x][y-1]=group[x][y];
                                q.push({x,y-1});
                            }
                            if(y+1<len&&grid[x][y+1]&&group[x][y+1]==-1){
                                group[x][y+1]=group[x][y];
                                q.push({x,y+1});
                            }
                        }
                    }
                }
            }
            string mask = "";
            string F = "";
            string B = "";
            map<int,int>last;
            bool ne = 0;
            for(int i = quadlen-1;i<len;i++){
                for(int j = len-1;j>=quadlen-1;j--){
                    if(i==quadlen-1||j==quadlen-1){
                        if(grid[i][j]){
                            mask+="1";
                            if(!ne){
                                if(last.find(group[i][j])==last.end()){
                                    //new
                                    last[group[i][j]]=F.size();
                                    F+="1";
                                    B+="0";
                                }
                                else{
                                    last[group[i][j]]=F.size();
                                    F+="0";
                                    B+="0";
                                }
                            }
                            ne=1;
                        }
                        else{
                            mask+="0";
                            ne=0;
                        }
                    }
                }
            }
            for(pair<int,int>p:last){
                B[p.second]='1';
            }
            while(mask.size()<41){
                mask+="0";
            }
            while(F.size()<21){
                F+="1";
            }
            while(B.size()<21){
                B+="1";
            }
            string inter(10,'0');
            for(int i = 0;i<10;i++){
                if((1<<i)&internal){
                    inter[i]='1';
                }
            }
            return inter+mask+F+B+string(7,'0');
        }
    }
    else{
        //last phase must accumulate data from 4 corners
        //they should be overlapping at edges
        int len = n*2+1;
        if(n==1){
            //corner
            bool grid[len][len];
            bool vis[len][len];
            for(int i = 0;i<len;i++){
                for(int j = 0;j<len;j++){
                    grid[i][j]=(a[i][j][0]=='1');
                    vis[i][j]=0;
                }
            }
            int ans = 0;
            for(int i = 0;i<len;i++){
                for(int j = 0;j<len;j++){
                    if(!vis[i][j]&&grid[i][j]){
                        ans++;
                        queue<array<int,2>>q;
                        q.push({i,j});
                        vis[i][j]=1;
                        while(!q.empty()){
                            auto [x,y] = q.front();
                            q.pop();
                            if(x-1>=0&&grid[x-1][y]&&!vis[x-1][y]){
                                vis[x-1][y]=1;
                                q.push({x-1,y});
                            }
                            if(x+1<len&&grid[x+1][y]&&!vis[x+1][y]){
                                vis[x+1][y]=1;
                                q.push({x+1,y});
                            }
                            if(y-1>=0&&grid[x][y-1]&&!vis[x][y-1]){
                                vis[x][y-1]=1;
                                q.push({x,y-1});
                            }
                            if(y+1<len&&grid[x][y+1]&&!vis[x][y+1]){
                                vis[x][y+1]=1;
                                q.push({x,y+1});
                            }
                        }
                    }
                }
            }
            string fin(100,'0');
            for(int i = 0;i<30;i++){
                if((1<<i)&ans){
                    fin[i]='1';
                }
            }
            return fin;
        }
        int quadlen = (len+1)/2;
        int ans = 0;
        for(int i = 0;i<10;i++){
            if(a[0][0][i]=='1'){
                ans+=(1<<i);
            }
            if(a[0][2][i]=='1'){
                ans+=(1<<i);
            }
            if(a[2][0][i]=='1'){
                ans+=(1<<i);
            }
            if(a[2][2][i]=='1'){
                ans+=(1<<i);
            }
        }
        bool grid[len][len];
        for(int i = 0;i<len;i++){
            for(int j = 0;j<len;j++){
                grid[i][j]=0;
                if(i==quadlen-1){
                    //check bit
                    if(j<quadlen){
                        //use bottom left
                        grid[i][j]=(a[2][0][10+j]=='1');
                    }
                    else{
                        //use bottom right
                        grid[i][j]=(a[2][2][10+(len-j-1)]=='1');
                    }
                }
                else if(j==quadlen-1){
                    if(i<quadlen){
                        //top left
                        grid[i][j]=(a[0][0][10+i]=='1');
                    }
                    else{
                        //bottom left
                        grid[i][j]=(a[2][0][10+i]=='1');
                    }
                }
            }
        }
        //formed now must connect required edges
        //top left
        int ind = 0;
        bool ne = 0;
        vector<array<int,2>>stek;
        map<array<int,2>,vector<array<int,2>>>g;
        for(int i = 0;i<quadlen;i++){
            for(int j = quadlen-1;j>=0;j--){
                if(i==quadlen-1||j==quadlen-1){
                    if(!ne){
                        if(grid[i][j]){
                            ne=1;
                            //new segment indth
                            if(a[0][0][ind+51]=='1'){
                                //new beginning
                                stek.push_back({i,j});
                            }
                            else{
                                g[{i,j}].push_back(stek.back());
                                g[stek.back()].push_back({i,j});
                            }
                            if(a[0][0][ind+72]=='1'){
                                //end
                                stek.pop_back();
                            }
                            ind++;
                        }
                    }
                    if(!grid[i][j]){
                        ne=0;
                    }
                }
            }
        }
        //top right

        ind = 0;
        ne = 0;
        assert(stek.size()==0);
        for(int i = 0;i<quadlen;i++){
            for(int j = quadlen-1;j<len;j++){
                if(i==quadlen-1||j==quadlen-1){
                    if(!ne){
                        if(grid[i][j]){
                            ne=1;
                            //new segment indth
                            if(a[0][2][ind+51]=='1'){
                                //new beginning
                                stek.push_back({i,j});
                            }
                            else{
                                g[{i,j}].push_back(stek.back());
                                g[stek.back()].push_back({i,j});
                            }
                            if(a[0][2][ind+72]=='1'){
                                //end
                                stek.pop_back();
                            }
                            ind++;
                        }
                    }
                    if(!grid[i][j]){
                        ne=0;
                    }
                }
            }
        }

        //bottom left

        ind = 0;
        ne = 0;
        assert(stek.size()==0);
        for(int i = quadlen-1;i<len;i++){
            for(int j = 0;j<quadlen;j++){
                if(i==quadlen-1||j==quadlen-1){
                    if(!ne){
                        if(grid[i][j]){
                            ne=1;
                            //new segment indth
                            if(a[2][0][ind+51]=='1'){
                                //new beginning
                                stek.push_back({i,j});
                            }
                            else{
                                g[{i,j}].push_back(stek.back());
                                g[stek.back()].push_back({i,j});
                            }
                            if(a[2][0][ind+72]=='1'){
                                //end
                                stek.pop_back();
                            }
                            ind++;
                        }
                    }
                    if(!grid[i][j]){
                        ne=0;
                    }
                }
            }
        }
        //bottom right

        ind = 0;
        ne = 0;
        assert(stek.size()==0);
        for(int i = quadlen-1;i<len;i++){
            for(int j = len-1;j>=quadlen-1;j--){
                if(i==quadlen-1||j==quadlen-1){
                    if(!ne){
                        if(grid[i][j]){
                            ne=1;
                            //new segment indth
                            if(a[2][2][ind+51]=='1'){
                                //new beginning
                                stek.push_back({i,j});
                            }
                            else{
                                g[{i,j}].push_back(stek.back());
                                g[stek.back()].push_back({i,j});
                            }
                            if(a[2][2][ind+72]=='1'){
                                //end
                                stek.pop_back();
                            }
                            ind++;
                        }
                    }
                    if(!grid[i][j]){
                        ne=0;
                    }
                }
            }
        }
        map<array<int,2>,bool>vis;
        for(int i = 0;i<len;i++){
            for(int j = 0;j<len;j++){
                if(!vis[{i,j}]&&grid[i][j]){
                    ans++;
                }
                else{
                    continue;
                }
                queue<array<int,2>>q;
                q.push({i,j});
                vis[{i,j}]=1;
                while(!q.empty()){
                    auto [x,y] = q.front();
                    q.pop();
                    for(array<int,2>a:g[{x,y}]){
                        if(!vis[a]){
                            vis[a]=1;
                            q.push(a);
                        }
                    }
                    if(x-1>=0&&grid[x-1][y]&&!vis[{x-1,y}]){
                        vis[{x-1,y}]=1;
                        q.push({x-1,y});
                    }
                    if(x+1<len&&grid[x+1][y]&&!vis[{x+1,y}]){
                        vis[{x+1,y}]=1;
                        q.push({x+1,y});
                    }
                    if(y-1>=0&&grid[x][y-1]&&!vis[{x,y-1}]){
                        vis[{x,y-1}]=1;
                        q.push({x,y-1});
                    }
                    if(y+1<len&&grid[x][y+1]&&!vis[{x,y+1}]){
                        vis[{x,y+1}]=1;
                        q.push({x,y+1});
                    }
                }
            }
        }
        string fin(100,'0');
        for(int i = 0;i<30;i++){
            if((1<<i)&ans){
                fin[i]='1';
            }
        }
        return fin;
    }
    return string(100,'0');
}
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…