uva 1423 Guess

来源:互联网 发布:什么手机有4g网络 编辑:程序博客网 时间:2024/05/21 11:15

/* 利用前缀和的思想进行转化,每个符号可以得出一个不等关系,利用前缀和将其转化为二元关系,

然后一个二元组为一条有向边,进行拓扑排序,按拓扑的顺序进行赋值。*/

#include <stdio.h>#include <cstring>#include <algorithm>#include <queue>#include <iostream>using namespace std;bool map[11][11];int in[11],ans[11];bool vis[11];int n;void topsort(){    queue <int> q;    for(int i=0; i<=n; i++)        if(in[i]==0) q.push(i);    int num=0;    while(!q.empty())    {        int u=q.front();        q.pop();        num++;        for(int i=0; i<=n; i++)        {            if(map[u][i])            {                in[i]--;                if(in[i]==0)                {                    q.push(i);                    ans[i]=num;                }            }        }    }}int main(){    //freopen("a.txt","r",stdin);    int t;    scanf("%d",&t);    char s[100];    while(t--)    {        scanf("%d",&n);        scanf(" %s",s);        memset(map,false,sizeof(map));        memset(in,0,sizeof(in));        memset(ans,0,sizeof(ans));        int h=0;        for(int i=1; i<=n; i++)            for(int j=i; j<=n; j++)            {                if(s[h]=='+') map[i-1][j]=true,in[j]++;                else if(s[h]=='-') map[j][i-1]=true,in[i-1]++;                h++;            }        topsort();        for(int i=1; i<n; i++)            printf("%d ",ans[i]-ans[i-1]);        printf("%d\n",ans[n]-ans[n-1]);    }    return 0;}


原创粉丝点击