http://acm.hdu.edu.cn/showproblem.php?pid=5961
这题难道就真的考点是bitset吗。。。
真就O(n^3/32)能过n=2016呗
那个竞赛图放在这里也不知道有什么用,直接枚举每条边u->v,那么右v->x必有u->x,所以只要判断对于u的每条出边u->v,v能到的点是不是u也都能到就行了。
#include<bits/stdc++.h>
#define maxl 2017
using namespace std;
int n,ans;
bitset <2017> pe[maxl],qe[maxl];
char s[maxl];
inline void prework()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
pe[i].reset(),qe[i].reset();
for(int i=1;i<=n;i++)
{
scanf("%s",s+1);
for(int j=1;j<=n;j++)
{
if(s[j]=='P')
pe[i][j]=1;
if(s[j]=='Q')
qe[i][j]=1;
}
}
}
inline void mainwork()
{
ans=1;
for(int i=1;i<=n;++i)
for(int j=1;j<=n;++j)
{
if(pe[i][j]>0)
{
if((pe[i]|pe[j])!=pe[i])
{
ans=0;
return;
}
}
if(qe[i][j]>0)
{
if((qe[i]|qe[j])!=qe[i])
{
ans=0;
return;
}
}
}
}
inline void print()
{
if(ans)
puts("T");
else
puts("N");
}
int main()
{
int t;
scanf("%d",&t);
for(int i=1;i<=t;i++)
{
prework();
mainwork();
print();
}
return 0;
}