#include<bits/stdc++.h>
#define PII pair<int,int>
#define f first
#define s second
#define VI vector<int>
#define LL long long
#define MP make_pair
#define LD long double
#define PB push_back
#define ALL(V) V.begin(),V.end()
#define abs(x) max((x),-(x))
#define PDD pair<LD,LD>
#define VPII vector< PII >
#define siz(V) ((int)V.size())
#define FOR(x, b, e) for(int x=b;x<=(e);x++)
#define FORD(x, b, e) for(int x=b;x>=(e);x--)
#define REP(x, n) for(int x=0;x<(n);x++)
#define mini(a,b) a=min(a,b)
#define maxi(a,b) a=max(a,b)
using namespace std;
int n,a,b,c,d,k,m,q,z;
char ch;
const int S=201;
bitset<S> start,x;
bitset<S> in[202];
main()
{
scanf("%d%d%d",&n,&m,&q);
REP(i,n)
{
REP(j,n)
{
scanf(" %c",&ch);
in[i][j]=ch=='1';
}
}
REP(i,q)
{
scanf("%d",&a);
start[a-1]=1;
}
int X=1000000*30/pow(n,0.6)+3;
REP(i,X)
{
// cerr<<i<<" "<<start<<endl;
x.reset();
bool ok=1;
FOR(i,m,n-1)
{
if(start[i]){ok=0;break;}
}
if(ok)
{
printf("%d\n",i);
return 0;
}
REP(i,n)
{
if(start[i])x|=in[i];
}
start=x;
}
puts("-1");
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 | #include<bits/stdc++.h> #define PII pair<int,int> #define f first #define s second #define VI vector<int> #define LL long long #define MP make_pair #define LD long double #define PB push_back #define ALL(V) V.begin(),V.end() #define abs(x) max((x),-(x)) #define PDD pair<LD,LD> #define VPII vector< PII > #define siz(V) ((int)V.size()) #define FOR(x, b, e) for(int x=b;x<=(e);x++) #define FORD(x, b, e) for(int x=b;x>=(e);x--) #define REP(x, n) for(int x=0;x<(n);x++) #define mini(a,b) a=min(a,b) #define maxi(a,b) a=max(a,b) using namespace std; int n,a,b,c,d,k,m,q,z; char ch; const int S=201; bitset<S> start,x; bitset<S> in[202]; main() { scanf("%d%d%d",&n,&m,&q); REP(i,n) { REP(j,n) { scanf(" %c",&ch); in[i][j]=ch=='1'; } } REP(i,q) { scanf("%d",&a); start[a-1]=1; } int X=1000000*30/pow(n,0.6)+3; REP(i,X) { // cerr<<i<<" "<<start<<endl; x.reset(); bool ok=1; FOR(i,m,n-1) { if(start[i]){ok=0;break;} } if(ok) { printf("%d\n",i); return 0; } REP(i,n) { if(start[i])x|=in[i]; } start=x; } puts("-1"); } |
English