牛客(多校4):Investigating Legions

牛客(多校4):Investigating Legions_第1张图片
牛客(多校4):Investigating Legions_第2张图片
牛客(多校4):Investigating Legions_第3张图片
牛客(多校4):Investigating Legions_第4张图片

#include
#define pb push_back
using namespace std;
typedef long long ll;
const int maxn=305;
const int mod=1e9+7;
const ll INF=1e18;
int a[maxn][maxn],tag[maxn],f[maxn];
int mp[15],ans[maxn];
char str[maxn*maxn];
void rua(){
    int n,s,kk=0,col=0;scanf("%d%d",&n,&s);
    scanf("%s",str);
    for(int i=1;i<=n;i++)for(int j=i+1;j<=n;j++)
        a[i][j]=a[j][i]=(str[kk++]-'0');
    for(int i=1;i<=n;i++) tag[i]=-1;
    for(int i=1;i<=n;i++) if(tag[i]==-1){
        int op=0;
        for(int j=1;j<=n;j++)
            if(tag[j]==-1 && a[i][j]) f[++op]=j;
        tag[i]=col;
        for(int j=1;j<=n;j++) if(tag[j]==-1){
            int num=0;
            for(int k=1;k<=op;k++) if(a[j][f[k]]) num++;
            if(num>=4*op/9) tag[j]=col;
        }
        col++;
    }
    col=0;
    for(int i=1;i<=n;i++){
        if(!mp[tag[i]]) ans[i]=++col,mp[tag[i]]=col;
        else ans[i]=mp[tag[i]];
    }
    for(int i=1;i<n;i++) printf("%d ",ans[i]-1);
    printf("%d\n",ans[n]-1);
}
int main(){
    int t;scanf("%d",&t);
    while(t--) rua();
    return 0;
}

你可能感兴趣的:(ACM)