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; }