POJ 3007 Organize Your Train part II

大致题意:

给定一个字符串,从任意位置把它切为两半,得到两条子串.

定义 子串1为s1,子串2为s2,子串1的反串为s3,子串2的反串为s4.

现在从s1 s2 s3 s4中任意取出两个串组合,问有多少种不同的组合方法.


这个题虽然分类是STL,但用STL肯定超时!!


我用的是二叉查找树,比map好使多了,218ms水过。


下面是代码:

#include <stdio.h>
#include <string.h>
#include <malloc.h>
typedef struct node
{
    char w[80];
    struct node *l,*r;
} node;
node head;
int p;
bool map1(char *s)
{
    node *p=&head;
    while(p)
    {
        if(strcmp(p->w,s)>0)
        {
            if(p->r)
            {
                p=p->r;
            }
            else
            {
                p->r=(node *)malloc(sizeof(node));
                strcpy(p->r->w,s);
                p->r->r=p->r->l=NULL;
                return false;
            }
        }
        else if(strcmp(p->w,s)<0)
        {
            if(p->l)
            {
                p=p->l;
            }
            else
            {
                p->l=(node *)malloc(sizeof(node));
                strcpy(p->l->w,s);
                p->l->r=p->l->l=NULL;
                return false;
            }
        }
        else
        {
            return true;
        }
    }
}
int main()
{
    int T;
    scanf("%d",&T);
    while(T--)
    {
        char s[80],c[80];
        scanf("%s",s);
        strcpy(head.w, s);
        head.l=head.r=NULL;
        p=strlen(s);
        int i,j,m=0;
        for(i=1; i<p; i++)
        {
            int cut=0;
            for(j=0; j<i; j++)
            {
                c[cut]=s[j];
                cut++;
            }
            for(j=p-1; j>=i; j--)
            {
                c[cut]=s[j];
                cut++;
            }
            c[cut]='\0';
            if(!map1(c))
            {
                m++;
            }
            cut=0;
            for(j=p-1; j>=i; j--)
            {
                c[cut]=s[j];
                cut++;
            }
            for(j=0; j<i; j++)
            {
                c[cut]=s[j];
                cut++;
            }
            c[cut]='\0';
            if(!map1(c))
            {
                m++;
            }
            cut=0;
            for(j=i-1; j>=0; j--)
            {
                c[cut]=s[j];
                cut++;
            }
            for(j=i; j<p; j++)
            {
                c[cut]=s[j];
                cut++;
            }
            c[cut]='\0';
            if(!map1(c))
            {
                m++;
            }
            cut=0;
            for(j=i; j<p; j++)
            {
                c[cut]=s[j];
                cut++;
            }
            for(j=i-1; j>=0; j--)
            {
                c[cut]=s[j];
                cut++;
            }
            c[cut]='\0';
            if(!map1(c))
            {
                m++;
            }
            cut=0;
            for(j=i-1; j>=0; j--)
            {
                c[cut]=s[j];
                cut++;
            }
            for(j=p-1; j>=i; j--)
            {
                c[cut]=s[j];
                cut++;
            }
            c[cut]='\0';
            if(!map1(c))
            {
                m++;
            }
            cut=0;
            for(j=p-1; j>=i; j--)
            {
                c[cut]=s[j];
                cut++;
            }
            for(j=i-1; j>=0; j--)
            {
                c[cut]=s[j];
                cut++;
            }
            c[cut]='\0';
            if(!map1(c))
            {
                m++;
            }
            cut=0;
            for(j=i; j<p; j++)
            {
                c[cut]=s[j];
                cut++;
            }
            for(j=0; j<i; j++)
            {
                c[cut]=s[j];
                cut++;
            }
            c[cut]='\0';
            if(!map1(c))
            {
                m++;
            }
        }
        printf("%d\n",m+1);
    }
    return 0;
}


posted @ 2013-09-18 19:58  、小呆  阅读(139)  评论(0编辑  收藏  举报