ぱーぽーの競プロ記

競技プログラミングに関することを書きます。

AOJ 2399 Save Your Privacy!

問題文はこちら↓
http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=2399


・概要
日本語なので省略。


・解法
やるだけです。

配列 bool people[101][101]とすると、people[ 誰が ][ 誰の個人情報 ]を知っている・知らないを保存しておき、あとは個人情報が漏洩した構成員の一覧とマッチするかを調べればよいです。


ソースコード

#include<iostream>
#include<algorithm>
#include<vector>
#include<string>
#include<cstdio>
#include<cstring>
using namespace std;

#define REP(i,x,n) for(int i = 0 ; i < (int)(n) ; i++)
#define rep(i,n) REP(i,0,n)

bool people[101][101];
int K[101];

int main(){
   int N;
   while(cin >> N){
      if(N==0)break;

      memset(people,false,sizeof(people));
      memset(K,false,sizeof(K));
           
      rep(i,N){
	 int m;
	 cin >> m;
	 rep(j,m){
	    int tmp;
	    cin >> tmp;
	    people[i+1][tmp] = true;
	 }
      }
      
      int k;
      cin >> k;
      rep(i,k)cin >> K[i];
      
      vector<int> v;
      rep(i,N){
	 bool flag = true;
	 rep(j,k){
	    if(!people[i+1][K[j]])flag = false;
	 }
	 if(flag)v.push_back(i+1);
      }
      
      if(v.size()==1)cout << v[0] << endl;
      else cout << "-1" << endl;
   }
	    
   return 0;
}