Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <cstring>
- #include <set>
- using namespace std;
- int main()
- {
- int t;
- scanf("%d",&t); //Број на тестови
- while(t--) //Додека т е поголемо од 0
- {
- int n;
- scanf("%d",&n);
- int totalDeleted=0; //Колку вкупно колони сме избршале
- int rowcount[3][n+1]; //rowcount[x][y] - Колку пати бројот y се појавува во ред x
- bool deleted[n]; //deleted[x] - true доколку колона x е избришана
- memset(rowcount,0,sizeof(rowcount)); //Се пополнува матрицата rowcount со вредност 0
- memset(deleted,false,sizeof(deleted)); //Исто за низата deleted со false
- int mat[3][n]; //Ова е за input-от
- for(int r=0;r<3;++r)
- for(int i=0;i<n;++i)
- {
- scanf("%d",&mat[r][i]);
- rowcount[r][mat[r][i]]++;
- }
- set<int> toDelete; //Тука ќе ги чуваме броевите кои треба да ги избришеме.
- //Со множество можеме лесно да провериме дали некој број е внатре или не, и исто така не се ставаат дупликати.
- for(int i=1;i<=n;++i) //Проверуваме за сите броеви дали бројот го нема во некој ред а го има во друг
- { //Доколку се исполни таков услов, го ставаме тој број во toDelete
- if(rowcount[0][i]==0 && (rowcount[1][i]>0 || rowcount[2][i]>0))
- toDelete.insert(i);
- else if(rowcount[1][i]==0 && (rowcount[0][i]>0 || rowcount[2][i]>0))
- toDelete.insert(i);
- else if(rowcount[2][i]==0 && (rowcount[0][i]>0 || rowcount[1][i]>0))
- toDelete.insert(i);
- }
- while(!toDelete.empty()) //Се додека има броеви за бришење
- {
- for(int r=0;r<3;++r)
- for(int i=0;i<n;++i) //Го изминуваме целиот input
- if(toDelete.find(mat[r][i])!=toDelete.end() && !deleted[i]) //Доколку бројот на таа позиција се наоѓа во toDelete и колоната не е избришана
- {
- deleted[i]=true; //Ја означуваме колоната како избришана (да не ја бришеме повеќе пати)
- rowcount[0][mat[0][i]]--; //Бидејќи сме го избришале бројот mat[0][i] од редица 0, го намалуваме бројачот за 1
- rowcount[1][mat[1][i]]--;
- rowcount[2][mat[2][i]]--;
- totalDeleted++;
- }
- toDelete.clear(); //Сме завршиле со бришење на овие броеви, го празниме множеството
- for(int i=1;i<=n;++i) //Исто како кодот горе, бараме дали има нови броеви кои треба да се бришат
- {
- if(rowcount[0][i]==0 && (rowcount[1][i]>0 || rowcount[2][i]>0))
- toDelete.insert(i);
- else if(rowcount[1][i]==0 && (rowcount[0][i]>0 || rowcount[2][i]>0))
- toDelete.insert(i);
- else if(rowcount[2][i]==0 && (rowcount[0][i]>0 || rowcount[1][i]>0))
- toDelete.insert(i);
- }
- } //Доколку има нови броеви за бришење, ќе започне повторно while циклусот. Во спротивно, печати резултат
- printf("%d\n",totalDeleted);
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement