这题题意转化一下,给一个字符串,然后从任意位置把这个串分成两个子串(都不是空串),然后两个串a,b得到他们的反串c,d。最后得到8种组合ab,ad,cb,cd,ba,da,bc,cd。问最终可以得到多少种字符串。
用STL神马的会超时,所以用hash。于是写了个静态链表,1Y~
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int prime=5001;
char strtable[1000][100];
struct T
{
int no;
int next;
};
T hash[10000];
int lh,lc;
int val(char *str)
{
int s,i;
i=0;
s=0;
while (str[i])
{
s+=str[i];
i++;
}
return s;
}
bool find(char *str)
{
int vs,t;
vs=val(str);
vs%=prime;
if (hash[vs].no == -1)
{
hash[vs].no=lc;
strcpy(strtable[lc],str);
lc++;
return false;
}
t=vs;
while (hash[t].no != -1)
{
if (strcmp(strtable[hash[t].no],str) == 0)
return true;
if (hash[t].next == -1)
{
hash[t].next=lh;
hash[lh].no=lc;
strcpy(strtable[lc],str);
lc++;
hash[lh].next=-1;
lh++;
return false;
}
t=hash[t].next;
}
return false;
}
int main()
{
int prob,ls,i,j,lt,ans;
char str[100],ts[100];
scanf("%d",&prob);
getchar();
while (prob--)
{
scanf("%s",str);
ls=strlen(str);
lh=prime;
lc=0;
ans=0;
for (i=0; i<10000; i++)
{
hash[i].no=-1;
hash[i].next=-1;
}
for (i=1; i<=ls-1; i++)
{
lt=0;
for (j=i-1; j>=0; j--)
{
ts[lt++]=str[j];
}
for (j=i; j<ls; j++)
{
ts[lt++]=str[j];
}
ts[lt]='\0';
if (find(ts) == false)
{
ans++;
}
lt=0;
for (j=0; j<i; j++)
{
ts[lt++]=str[j];
}
for (j=ls-1; j>=i; j--)
{
ts[lt++]=str[j];
}
ts[lt]='\0';
if (find(ts) == false) ans++;
lt=0;
for (j=i; j<ls; j++)
{
ts[lt++]=str[j];
}
for (j=i-1; j>=0; j--)
{
ts[lt++]=str[j];
}
ts[lt]='\0';
if (find(ts) == false) ans++;
lt=0;
for (j=ls-1; j>=i; j--)
{
ts[lt++]=str[j];
}
for (j=0; j<i; j++)
{
ts[lt++]=str[j];
}
ts[lt]='\0';
if (find(ts) == false) ans++;
lt=0;
for (j=0; j<i; j++)
{
ts[lt++]=str[j];
}
for (j=i; j<ls; j++)
{
ts[lt++]=str[j];
}
ts[lt]='\0';
if (find(ts) == false) ans++;
lt=0;
for (j=i; j<ls; j++)
{
ts[lt++]=str[j];
}
for (j=0; j<i; j++)
{
ts[lt++]=str[j];
}
ts[lt]='\0';
if (find(ts) == false) ans++;
lt=0;
for (j=ls-1; j>=i; j--)
{
ts[lt++]=str[j];
}
for (j=i-1; j>=0; j--)
{
ts[lt++]=str[j];
}
ts[lt]='\0';
if (find(ts) == false) ans++;
lt=0;
for (j=i-1; j>=0; j--)
{
ts[lt++]=str[j];
}
for (j=ls-1; j>=i; j--)
{
ts[lt++]=str[j];
}
ts[lt]='\0';
if (find(ts) == false) ans++;
}
printf("%d\n",ans);
}
}