hdu 4119 Isabella's Message(模拟+字典树)

来源:互联网 发布:淘宝限时秒杀问题 编辑:程序博客网 时间:2024/04/30 03:18

这题有点儿烦!

模拟赛的时候写了快两个小时,终于A掉了。

#include<stdio.h>#include<string.h>#include<malloc.h>#include<stdlib.h>#define N 105char map1[N][N],map2[N][N],s[2505];char s1[5][2505],s2[5][2505];int flag[5];int n;int mark[N][N],mark1[N][N];struct node{    node *next[27];    int flag;}*root;struct point{int x,y;}a[100005];int cmp(const void *a,const void *b){    return strcmp((char *)a,(char *)b);}int cmp1(const void *a,const void *b){point *c=(point *)a;point *d=(point *)b;if(c->x!=d->x)return c->x-d->x;elsereturn c->y-d->y;}void Init(node *s){    s->flag=0;    memset(s->next,0,sizeof(s->next));    return ;}void InsertTree(char *s){    int ln=strlen(s);    node *p=root,*q;    for(int i=0;i<ln;i++)    {        int t=s[i]-'a';        if(p->next[t]!=NULL)            p=p->next[t];        else        {            q=(node *)malloc(sizeof(node));            Init(q);            p->next[t]=q;            p=q;        }        if(i==ln-1) p->flag=1;    }    return ;}int fun(int t,int tt,int ttt){    int k=0;    for(int i=0;i<n;i++)    {        for(int j=0;j<n;j++)        {            int x,y;            if(mark[i][j]==1)            {                if(t==0)                    x=i,y=j;                else if(t==1)                    x=j,y=n-i-1;                else if(t==2)                    x=n-i-1,y=n-j-1;                else if(t==3)                    x=n-j-1,y=i;a[k].x=x;a[k].y=y;k++;            }        }    }qsort(a,k,sizeof(a[0]),cmp1);for(int i=0;i<k;i++){int ca,cao;ca=a[i].x;cao=a[i].y;if(map1[ca][cao]!='.'&&mark1[ca][cao]!=-1){s1[ttt][tt++]=map1[ca][cao];mark1[ca][cao]=-1;}else if(mark1[ca][cao]!=-1){s1[ttt][tt++]=' ';mark1[ca][cao]=-1;}}    return tt;}/*void fuck(int x){qsort(a,flag[x],sizeof(a[0]),cmp1);for(int i=0;i<flag[x];i++){int t,tt;t=a[i].x;tt=a[i].y;if(map1[t][tt]!='.')s1[x][i]=map1[t][tt];elses1[x][i]=' ';}return ;}*/int Find(char *s){    node *p=root;    int ln=strlen(s);    for(int i=0;i<ln;i++)    {        int t=s[i]-'a';        if(p->next[t]!=NULL)            p=p->next[t];        else            return 0;        if(i==ln-1&&p->flag==0) return 0;    }    return 1;}int judge(char *s){    char ss[2505];    int k=0;    int ln=strlen(s);    for(int i=0;i<ln;i++)    {        if(s[i]!=' ')            ss[k++]=s[i];        else        {            ss[k]='\0';            if(!Find(ss))                return 0;            k=0;        }    }    ss[k]='\0';    if(!Find(ss)) return 0;    return 1;}int main(){    int T;    scanf("%d",&T);    int cnt=1;    while(T--)    {        scanf("%d",&n);        getchar();        for(int i=0;i<n;i++)        {            for(int j=0;j<n;j++)                scanf("%c",&map1[i][j]);            getchar();        }        memset(mark,0,sizeof(mark));        for(int i=0;i<n;i++)        {            for(int j=0;j<n;j++)            {                scanf("%c",&map2[i][j]);                if(map2[i][j]=='.') mark[i][j]=0;                else mark[i][j]=1;            }            getchar();        }        int m;        root=(node *)malloc(sizeof(node));        Init(root);        scanf("%d",&m);        getchar();        while(m--)        {            gets(s);            InsertTree(s);        }        memset(flag,0,sizeof(flag));memset(mark1,0,sizeof(mark1));        flag[0]=fun(0,flag[0],0);        flag[0]=fun(1,flag[0],0);        flag[0]=fun(2,flag[0],0);        flag[0]=fun(3,flag[0],0);//fuck(0);memset(mark1,0,sizeof(mark1));        flag[1]=fun(1,flag[1],1);        flag[1]=fun(2,flag[1],1);        flag[1]=fun(3,flag[1],1);        flag[1]=fun(0,flag[1],1);//fuck(1);memset(mark1,0,sizeof(mark1));        flag[2]=fun(2,flag[2],2);        flag[2]=fun(3,flag[2],2);        flag[2]=fun(0,flag[2],2);        flag[2]=fun(1,flag[2],2);//fuck(2);memset(mark1,0,sizeof(mark1));        flag[3]=fun(3,flag[3],3);        flag[3]=fun(0,flag[3],3);        flag[3]=fun(1,flag[3],3);        flag[3]=fun(2,flag[3],3);//fuck(3);        for(int i=0;i<4;i++)        {            int k=0;            for(int j=0;j<flag[i];j++)            {                if(k==0&&s1[i][j]==' ')                    continue;                if(s1[i][j]!=' ')                    s2[i][k++]=s1[i][j];                else if(s2[i][k-1]!=' '&&s1[i][j]==' ')                    s2[i][k++]=s1[i][j];                else                    continue;            }            while(s2[i][k-1]==' ')                k--;s2[i][k]='\0';            flag[i]=k;        }        qsort(s2,4,sizeof(s2[0]),cmp);        int i;        for(i=0;i<4;i++)        {            if(judge(s2[i]))                break;        }if(i==4){printf("Case #%d: FAIL TO DECRYPT\n",cnt++);continue;}        s2[i][flag[i]]='\0';        printf("Case #%d: %s\n",cnt++,s2[i]);    }    return 0;}


原创粉丝点击