POJ 3007:Organize Your Train part II
| Time Limit: 1000MS | Memory Limit: 65536K | |
| Total Submissions: 7561 | Accepted: 2194 |
Description
RJ Freight, a Japanese railroad company for freight operations has recently constructed exchange lines at Hazawa, Yokohama. The layout of the lines is shown in Figure 1.

Figure 1: Layout of the exchange lines
A freight train consists of 2 to 72 freight cars. There are 26 types of freight cars, which are denoted by 26 lowercase letters from "a" to "z". The cars of the same type are indistinguishable from each other, and each car's direction doesn't matter either.
Thus, a string of lowercase letters of length 2 to 72 is sufficient to completely express the configuration of a train.
Upon arrival at the exchange lines, a train is divided into two sub-trains at an arbitrary position (prior to entering the storage lines). Each of the sub-trains may have its direction reversed (using the reversal line). Finally, the two sub-trains are connected
in either order to form the final configuration. Note that the reversal operation is optional for each of the sub-trains.
For example, if the arrival configuration is "abcd", the train is split into two sub-trains of either 3:1, 2:2 or 1:3 cars. For each of the splitting, possible final configurations are as follows ("+" indicates final concatenation position):
[3:1]
abc+d cba+d d+abc d+cba
[2:2]
ab+cd ab+dc ba+cd ba+dc cd+ab cd+ba dc+ab dc+ba
[1:3]
a+bcd a+dcb bcd+a dcb+a
Excluding duplicates, 12 distinct configurations are possible.
Given an arrival configuration, answer the number of distinct configurations which can be constructed using the exchange lines described above.
Input
The entire input looks like the following.
the number of datasets = m
1st dataset
2nd dataset
...
m-th dataset
Each dataset represents an arriving train, and is a string of 2 to 72 lowercase letters in an input line.
Output
For each dataset, output the number of possible train configurations in a line. No other characters should appear in the output.
Sample Input
4
aa
abba
abcd
abcde
Sample Output
1
6
12
18
一串字符串,从中间的某一处切开,前后都可能reverse,然后这两部分前后都有可能,即正常情况下可能出现8中不同的字符串。然后问所有这些可能的字符串中有多少种不同的。
自己写hash会TLE,只能自己写。各种麻烦,函数返回局部变量的指针容易出问题,这样不行。
代码:
#include <iostream>
#include <algorithm>
#include <cmath>
#include <vector>
#include <string>
#include <cstring>
#pragma warning(disable:4996)
using namespace std; #define maxn 80 int num;
//char *wang_reverse,*sub1,*sub2,*sub3,*sub4;
//char *res1,*res2,*res3,*res4,*res5,*res6,*res7,*res8;
char sub1[80],sub2[80],sub3[80],sub4[80];
char res1[80],res2[80],res3[80],res4[80],res5[80],res6[80],res7[80],res8[80];
struct no
{
char str[maxn]; }node[maxn*maxn]; void reverse2(char *str)
{
int i,j,len;
len=strlen(str);
for(i=len-1,j=0;i>=0;i--,j++)
sub3[j]=str[i];
sub3[j]='\0';
} void reverse3(char *str)
{
int i,j,len;
len=strlen(str);
for(i=len-1,j=0;i>=0;i--,j++)
sub4[j]=str[i];
sub4[j]='\0';
} void substr(char *str,int i)
{
int j; for(j=0;j<i;j++)
sub1[j]=str[j];
sub1[j]='\0';
} void substr_rever(char *str,int i)
{
int x,j,len; len=strlen(str);
for(j=len-1,x=0;j>=i;j--,x++)
sub2[x]=str[j];
sub2[x]='\0';
} void add_str1(char *re1,char *re2)
{
int len1=strlen(re1);
int len2=strlen(re2);
int i,j; for(i=0;i<len1;i++)
{
res1[i]=re1[i];
}
for(j=0;j<len2;j++)
{
res1[i]=re2[j];
i++;
}
} void add_str2(char *re1,char *re2)
{
int len1=strlen(re1);
int len2=strlen(re2);
int i,j; for(i=0;i<len1;i++)
{
res2[i]=re1[i];
}
for(j=0;j<len2;j++)
{
res2[i]=re2[j];
i++;
}
} void add_str3(char *re1,char *re2)
{
int len1=strlen(re1);
int len2=strlen(re2);
int i,j; for(i=0;i<len1;i++)
{
res3[i]=re1[i];
}
for(j=0;j<len2;j++)
{
res3[i]=re2[j];
i++;
}
} void add_str4(char *re1,char *re2)
{
int len1=strlen(re1);
int len2=strlen(re2);
int i,j; for(i=0;i<len1;i++)
{
res4[i]=re1[i];
}
for(j=0;j<len2;j++)
{
res4[i]=re2[j];
i++;
}
} void add_str5(char *re1,char *re2)
{
int len1=strlen(re1);
int len2=strlen(re2);
int i,j; for(i=0;i<len1;i++)
{
res5[i]=re1[i];
}
for(j=0;j<len2;j++)
{
res5[i]=re2[j];
i++;
}
}
void add_str6(char *re1,char *re2)
{
int len1=strlen(re1);
int len2=strlen(re2);
int i,j; for(i=0;i<len1;i++)
{
res6[i]=re1[i];
}
for(j=0;j<len2;j++)
{
res6[i]=re2[j];
i++;
}
}
void add_str7(char *re1,char *re2)
{
int len1=strlen(re1);
int len2=strlen(re2);
int i,j; for(i=0;i<len1;i++)
{
res7[i]=re1[i];
}
for(j=0;j<len2;j++)
{
res7[i]=re2[j];
i++;
}
}
void add_str8(char *re1,char *re2)
{
int len1=strlen(re1);
int len2=strlen(re2);
int i,j; for(i=0;i<len1;i++)
{
res8[i]=re1[i];
}
for(j=0;j<len2;j++)
{
res8[i]=re2[j];
i++;
}
} bool judge(char *str)
{
int i;
for(i=0;i<num;i++)
{
if(strcmp(str,node[i].str)==0)
{
return false;
}
}
return true;
} int main()
{
//freopen("i.txt","r",stdin);
//freopen("o.txt","w",stdout); char wang[80];
int test,i,len;
scanf("%d",&test); while(test--)
{
for(i=0;i<80;i++)
{
wang[i]='\0';
sub1[i]='\0';
sub2[i]='\0';
sub3[i]='\0';
sub4[i]='\0'; res1[i]='\0';
res2[i]='\0';
res3[i]='\0';
res4[i]='\0';
res5[i]='\0';
res6[i]='\0';
res7[i]='\0';
res8[i]='\0';
}
scanf("%s",wang);
num=0;
len=strlen(wang); for(i=1;i <= len-1;i++)
{
substr(wang,i);//sub1
substr_rever(wang,i);//sub2 reverse2(sub1);//sub3
reverse3(sub2);//sub4 add_str1(sub1,sub2);
add_str2(sub2,sub1); add_str3(sub3,sub2);
add_str4(sub2,sub3); add_str5(sub1,sub4);
add_str6(sub4,sub1); add_str7(sub3,sub4);
add_str8(sub4,sub3); if(judge(res1))
{
strcpy(node[num].str,res1);
num++;
}
if(judge(res2))
{
strcpy(node[num].str,res2);
num++;
}
if(judge(res3))
{
strcpy(node[num].str,res3);
num++;
}
if(judge(res4))
{
strcpy(node[num].str,res4);
num++;
}
if(judge(res5))
{
strcpy(node[num].str,res5);
num++;
}
if(judge(res6))
{
strcpy(node[num].str,res6);
num++;
}
if(judge(res7))
{
strcpy(node[num].str,res7);
num++;
}
if(judge(res8))
{
strcpy(node[num].str,res8);
num++;
}
}
printf("%d\n",num);
}
//system("pause");
return 0;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。
POJ 3007:Organize Your Train part II的更多相关文章
- POJ 3007 Organize Your Train part II
题意: 如上图所示,将一个字符串进行分割,反转等操作后不同字符串的个数: 例如字符串abba:可以按三种比例分割:1:3:2:2:3:1 部分反转可以得到如下所有的字符串: 去掉重复可以得到六个不同的 ...
- POJ 3007 Organize Your Train part II (字典树 静态)
Organize Your Train part II Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 6478 Acce ...
- Organize Your Train part II 字典树(此题专卡STL)
Organize Your Train part II Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 8787 Acce ...
- poj 3007 Organize Your Train part II(二叉排序树)
题目:http://poj.org/problem?id=3007 题意:按照图示的改变字符串,问有多少种..字符串.. 思路:分几种排序的方法,,刚开始用map 超时(map效率不高啊..),后来搜 ...
- POJ 3007 Organize Your Train part II(哈希链地址法)
http://poj.org/problem?id=3007 题意 :给你一个字符串,让你无论从什么地方分割,把这个字符串分成两部分s1和s2,然后再求出s3和s4,让你进行组合,看能出来多少种不同的 ...
- poj 3007 Organize Your Train part II(静态字典树哈希)
Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 6700 Accepted: 1922 Description RJ Freigh ...
- poj Organize Your Train part II
http://poj.org/problem?id=3007 #include<cstdio> #include<algorithm> #include<cstring& ...
- Organize Your Train part II(hash)
http://poj.org/problem?id=3007 第一次用STL做的,TLE了,自己构造字符串哈希函数才可以.. TLE代码: #include <cstdio> #inclu ...
- Organize Your Train part II-POJ3007模拟
Organize Your Train part II Time Limit: 1000MS Memory Limit: 65536K Description RJ Freight, a Japane ...
随机推荐
- 【PAT甲级】1030 Travel Plan (30 分)(SPFA,DFS)
题意: 输入N,M,S,D(N,M<=500,0<S,D<N),接下来M行输入一条边的起点,终点,通过时间和通过花费.求花费最小的最短路,输入这条路径包含起点终点,通过时间和通过花费 ...
- 「CF1303C Perfect Keyboard」
前置芝士 图的遍历:通过DFS或者BFS遍历全图. 前向星:用来存边,但是在本题用也可以用一个二维数组解决. 具体做法 先从判断YES和NO开始,可以发现如果一个字母与三个及以上不同的字母相邻时肯定是 ...
- Linux centosVMware MySQL常用操作设置更改root密码、连接mysql、mysql常用命令
一.设置更改root密码 启动mysql /usr/local/mysql/bin/mysql -uroot 更改环境变量PATH,增加mysql绝对路径 使mysql -uroot永久生效需要编辑, ...
- Linux centosVMware LAMP php-fpm的pool、php-fpm慢执行日志、open_basedir、php-fpm进程管理
一.php-fpm的pool vim /usr/local/php/etc/php-fpm.conf//在[global]部分增加 include = etc/php-fpm.d/*.conf mkd ...
- 如何在django-filter中用choice field 的 value 值过滤对象
如果我们有这样一个model: class IPInfoModel(models.Model): TYPE_INTRANET = 1 TYPE_INTERNET = 2 IP_TYPES = ( (T ...
- 微信小程序中,如何实现显示,隐藏密码的功能
最近在搞小程序的开发,遇到隐藏,显示密码的功能的时候,电脑上调试没问题,但是手机上面点击却没有效果,必须要跳转到其他页面再跳回来,才能正常显示. 一时间搞得我很头疼,查找资料后,终于知道了是什么原因. ...
- 【剑指Offer面试编程题】题目1522:包含min函数的栈--九度OJ
题目描述: 定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数. 输入: 输入可能包含多个测试样例,输入以EOF结束. 对于每个测试案例,输入的第一行为一个整数n(1<=n&l ...
- TCP 3次握手 && 4次分手
原文:https://github.com/jawil/blog/issues/14 3次握手 第一次握手:建立连接.客户端发送连接请求报文段,将SYN位置为1,Sequence Number为x:然 ...
- css 图形样式
参考:https://css-tricks.com/examples/ShapesOfCSS/
- Android问题:ScrollView默认位置不是最顶部最全解决方案
描述: Scrollview里面嵌套了一个listview ,这是开发中最寻常的一种布局,遇到的问题是:在这个Scrollview页面默认的起始位置不是最顶部,而是listview的底部. 原因: 在 ...