大致题意:
给定一个字符串,从任意位置把它切为两半,得到两条子串.
定义 子串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;
}