hdu 4039 暴力

思路:用map将每个字符串与一个数字进行对应,然后暴力统计就好了

#include<cstring>

#include<iostream>

#include<cstdio>

#include<algorithm>

#include<cmath>

#include<map>

#include<vector>

#include<string>

#define Maxn 2010

using namespace std;

int fr[Maxn][Maxn],mul[Maxn][Maxn],Max[Maxn];

char str[Maxn][20];

map<string,int> g;

vector<int> head[Maxn*2];

vector<int> ans[Maxn*2];

int cmp(int a,int b)

{

    return strcmp(str[a],str[b])<0;

}

int main()

{

    int t,n,q,i,j,k,Case=0,u,v;

    scanf("%d",&t);

    char s1[20],s2[20];

    while(t--)

    {

        memset(fr,0,sizeof(fr));

        memset(mul,0,sizeof(mul));

        memset(Max,0,sizeof(Max));

        g.clear();

        scanf("%d%d",&n,&q);

        for(i=0;i<=2*n;i++)

            head[i].clear(),ans[i].clear();

        int cnt=0;

        for(i=1;i<=n;i++)

        {

            scanf("%s %s",&s1,&s2);

            if(!g[s1]){

                g[s1]=++cnt;

                strcpy(str[cnt],s1);

            }

            if(!g[s2]){

                g[s2]=++cnt;

                strcpy(str[cnt],s2);

            }

            u=g[s1],v=g[s2];

            head[u].push_back(v);

            head[v].push_back(u);

            fr[u][v]=fr[v][u]=1;

        }

        int sz;

        for(i=1;i<=cnt;i++){

            sz=head[i].size();

            for(j=0;j<sz;j++){

                u=head[i][j];

                int ss=head[u].size();

                for(k=0;k<ss;k++){

                    v=head[u][k];

                    if(!fr[i][v]&&i!=v)

                        mul[i][v]++,Max[i]=max(Max[i],mul[i][v]);

                }

            }

        }

        for(i=1;i<=cnt;i++){

            for(j=1;j<=cnt;j++){

                if(j==i) continue;

                if(mul[i][j]==Max[i]&&Max[i])

                    ans[i].push_back(j);

            }

            sort(ans[i].begin(),ans[i].end(),cmp);

        }

        printf("Case %d:\n",++Case);

        //cout<<q<<endl;

        for(i=1;i<=q;i++){

            scanf("%s",s1);

            u=g[s1];

            if(ans[u].empty())

            printf("-");

            else{

                sz=ans[u].size();

                v=ans[u][0];

                printf("%s",str[v]);

                for(j=1;j<sz;j++){

                    v=ans[u][j];

                    printf(" %s",str[v]);

                }

            }

            printf("\n");

        }

    }

    return 0;

}

 

你可能感兴趣的:(HDU)