题意很好理解,看图都能懂,就不解释了。关键就在于训练计划上的分类,神马标准模板库的应用都是骗人的,不过小用一点也是能过的,不过时间就是800,900的。总之一点也不用c++库函数就稳稳的对。本人是用的c的一些字符串函数,然后字典树来哈希。用高效的字符串哈希函数也可以。
#include <iostream>
#include <algorithm>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <queue>
#include <map>
#define INF 0x3f3f3f3f
#define mod 100000000
using namespace std;
struct node
{
int num;
int next[27];
}d[100000];
int cnt,ans;
void init(int n)
{
d[n].num=0;
memset(d[n].next,0,sizeof(d[n].next));
}
void add(char *c)
{
int n,j=0;
for(;*c;c++)
{
n=*c-'a';
if(d[j].next[n]==0)
{
init(++cnt);
d[j].next[n]=cnt;
}
j=d[j].next[n];
}
if(!d[j].num){
d[j].num++;
ans++;
}
}
int main()
{
char str[100],strx[100];
char save[6][100];
int t,n;
scanf("%d%*c",&t);
while(t--)
{
init(0);
cnt=0;
ans=0;
scanf("%s",str);
int len=strlen(str);
for(int i=1;i<len;i++)
{
strncpy(save[1],str,i);
strncpy(save[2],str,i);
save[1][i]='\0';
save[2][i]='\0';
for(int j=0;j<i/2;j++)
{
swap(save[2][j],save[2][i-j-1]);
}
strncpy(save[3],str+i,len-i);
strncpy(save[4],str+i,len-i);
save[3][len-i]='\0';
save[4][len-i]='\0';
for(int j=0;j<(len-i)/2;j++)
{
swap(save[4][j],save[4][len-i-j-1]);
}
/*for(int j=1;j<=4;j++)
{
cout<<"*"<<save[j]<<endl;
}*/
for(int j=1;j<=4;j++)
{
if(j<=2)
{
strcpy(strx,save[j]);
strcat(strx,save[3]);
add(strx);
strcpy(strx,save[j]);
strcat(strx,save[4]);
add(strx);
}
else
{
strcpy(strx,save[j]);
strcat(strx,save[1]);
add(strx);
strcpy(strx,save[j]);
strcat(strx,save[2]);
add(strx);
}
}
for(int j=1;j<=4;j++)
{
save[j][0]='\0';
}
}
printf("%d\n",ans);
}
return 0;
}