A. Train and Peter

题目连接:

http://www.codeforces.com/contest/8/problem/A

Description

Peter likes to travel by train. He likes it so much that on the train he falls asleep.

Once in summer Peter was going by train from city A to city B, and as usual, was sleeping. Then he woke up, started to look through the window and noticed that every railway station has a flag of a particular colour.

The boy started to memorize the order of the flags' colours that he had seen. But soon he fell asleep again. Unfortunately, he didn't sleep long, he woke up and went on memorizing the colours. Then he fell asleep again, and that time he slept till the end of the journey.

At the station he told his parents about what he was doing, and wrote two sequences of the colours that he had seen before and after his sleep, respectively.

Peter's parents know that their son likes to fantasize. They give you the list of the flags' colours at the stations that the train passes sequentially on the way from A to B, and ask you to find out if Peter could see those sequences on the way from A to B, or from B to A. Remember, please, that Peter had two periods of wakefulness.

Peter's parents put lowercase Latin letters for colours. The same letter stands for the same colour, different letters — for different colours.

Input

The input data contains three lines. The first line contains a non-empty string, whose length does not exceed 105, the string consists of lowercase Latin letters — the flags' colours at the stations on the way from A to B. On the way from B to A the train passes the same stations, but in reverse order.

The second line contains the sequence, written by Peter during the first period of wakefulness. The third line contains the sequence, written during the second period of wakefulness. Both sequences are non-empty, consist of lowercase Latin letters, and the length of each does not exceed 100 letters. Each of the sequences is written in chronological order.

Output

Output one of the four words without inverted commas:

«forward» — if Peter could see such sequences only on the way from A to B;

«backward» — if Peter could see such sequences on the way from B to A;

«both» — if Peter could see such sequences both on the way from A to B, and on the way from B to A;

«fantasy» — if Peter could not see such sequences.

Sample Input

atob

a

b

Sample Output

forward

Hint

题意

有一个人在坐火车,不知道从A到B的还是从B到A的

现在他迷迷糊糊睡了一觉,然后醒来,写下来他看到的字符,然后又迷迷糊糊睡了下去,然后又写下他看到的字符

现在给你这个从A到B的字符串,问这个人坐的火车从A到B还是从B到A的

题解:

首先正着做,暴力求KMP,求匹配的位置,如果存在s1串和s2串匹配的位置不重合的话,就说明合法

正着做一次,再反着做一次就好了

代码

#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e5+7;
char s[maxn],s1[maxn],s2[maxn];
int p[maxn];
vector<int>p1;
vector<int>p2;
int main()
{
scanf("%s",s+1);
scanf("%s",s1+1);
scanf("%s",s2+1);
int len=strlen(s1+1);
int j=0;
for(int i=2;i<=len;i++)
{
while(j>0&&s1[j+1]!=s1[i])j=p[j];
if(s1[j+1]==s1[i])j++;p[i]=j;
}
int len2=strlen(s+1);
j=0;
for(int i=1;i<=len2;i++)
{
while(j>0&&s1[j+1]!=s[i])j=p[j];
if(s1[j+1]==s[i])j++;
if(j==len){p1.push_back(i),j=p[j];}
}
len = strlen(s2+1);
j=0;
memset(p,0,sizeof(p));
for(int i=2;i<=len;i++)
{
while(j>0&&s2[j+1]!=s2[i])j=p[j];
if(s2[j+1]==s2[i])j++;p[i]=j;
}
j=0;
for(int i=1;i<=len2;i++)
{
while(j>0&&s2[j+1]!=s[i])j=p[j];
if(s2[j+1]==s[i])j++;
if(j==len){p2.push_back(i),j=p[j];}
}
sort(p1.begin(),p1.end());
sort(p2.begin(),p2.end());
int flag1 = 0,flag2 = 0;
if(p1.size()!=0&&p2.size()!=0)
if(p1[0]+strlen(s2+1)<=p2[p2.size()-1])flag1=1; p1.clear(),p2.clear();
reverse(s+1,s+1+len2); memset(p,0,sizeof(p));
len=strlen(s1+1);
j=0;
for(int i=2;i<=len;i++)
{
while(j>0&&s1[j+1]!=s1[i])j=p[j];
if(s1[j+1]==s1[i])j++;p[i]=j;
}
len2=strlen(s+1);
j=0;
for(int i=1;i<=len2;i++)
{
while(j>0&&s1[j+1]!=s[i])j=p[j];
if(s1[j+1]==s[i])j++;
if(j==len){p1.push_back(i),j=p[j];}
}
len = strlen(s2+1);
j=0;
memset(p,0,sizeof(p));
for(int i=2;i<=len;i++)
{
while(j>0&&s2[j+1]!=s2[i])j=p[j];
if(s2[j+1]==s2[i])j++;p[i]=j;
}
j=0;
for(int i=1;i<=len2;i++)
{
while(j>0&&s2[j+1]!=s[i])j=p[j];
if(s2[j+1]==s[i])j++;
if(j==len){p2.push_back(i),j=p[j];}
}
sort(p1.begin(),p1.end());
sort(p2.begin(),p2.end());
if(p1.size()!=0&&p2.size()!=0)
if(p1[0]+strlen(s2+1)<=p2[p2.size()-1])flag2=1; if(flag1&&flag2)
return puts("both"),0;
if(flag1)
return puts("forward"),0;
if(flag2)
return puts("backward"),0;
return puts("fantasy"),0; }

Codeforces Beta Round #8 A. Train and Peter KMP的更多相关文章

  1. Codeforces Beta Round #80 (Div. 2 Only)【ABCD】

    Codeforces Beta Round #80 (Div. 2 Only) A Blackjack1 题意 一共52张扑克,A代表1或者11,2-10表示自己的数字,其他都表示10 现在你已经有一 ...

  2. Codeforces Beta Round #62 题解【ABCD】

    Codeforces Beta Round #62 A Irrational problem 题意 f(x) = x mod p1 mod p2 mod p3 mod p4 问你[a,b]中有多少个数 ...

  3. Codeforces Beta Round #83 (Div. 1 Only)题解【ABCD】

    Codeforces Beta Round #83 (Div. 1 Only) A. Dorm Water Supply 题意 给你一个n点m边的图,保证每个点的入度和出度最多为1 如果这个点入度为0 ...

  4. Codeforces Beta Round #13 C. Sequence (DP)

    题目大意 给一个数列,长度不超过 5000,每次可以将其中的一个数加 1 或者减 1,问,最少需要多少次操作,才能使得这个数列单调不降 数列中每个数为 -109-109 中的一个数 做法分析 先这样考 ...

  5. Codeforces Beta Round #79 (Div. 2 Only)

    Codeforces Beta Round #79 (Div. 2 Only) http://codeforces.com/contest/102 A #include<bits/stdc++. ...

  6. Codeforces Beta Round #77 (Div. 2 Only)

    Codeforces Beta Round #77 (Div. 2 Only) http://codeforces.com/contest/96 A #include<bits/stdc++.h ...

  7. Codeforces Beta Round #76 (Div. 2 Only)

    Codeforces Beta Round #76 (Div. 2 Only) http://codeforces.com/contest/94 A #include<bits/stdc++.h ...

  8. Codeforces Beta Round #75 (Div. 2 Only)

    Codeforces Beta Round #75 (Div. 2 Only) http://codeforces.com/contest/92 A #include<iostream> ...

  9. Codeforces Beta Round #74 (Div. 2 Only)

    Codeforces Beta Round #74 (Div. 2 Only) http://codeforces.com/contest/90 A #include<iostream> ...

随机推荐

  1. WordPress404页面自定义

    不知道大家是怎么设计404页面,个性的404可以为网站增色不少,wordpress设置404是在主题里面的404.php页面上,当然比如你用Apache.nginx等服务器,你可以自己建一个单页,内容 ...

  2. 【Python学习】request库

    Requests库(https://www.python-requests.org/)是一个擅长处理那些复杂的HTTP请求.cookie.header(响应头和请求头)等内容的Python第三方库. ...

  3. dlmalloc(一)【转】

    转自:http://blog.csdn.net/ycnian/article/details/12971863 我们写过很多C程序了,经常会分配内存.记得刚学C语言时老师说过,可以向两个地方申请内存: ...

  4. 健身VS不健身,完全是两种不同的人生!

    这两天一组同龄人合照 刷爆了国内健身圈, 图左是一位67岁的老人, 图右是67岁的健美运动员杨新民老师 相同年龄, 但从外观上有着强烈的距离感! 让多人不禁感叹,健身和不健身, 简直就是两种状态,两种 ...

  5. KVC, KVO 实现原理

    Key-Value Coding: 键值编码 (KVC) 方法调用: // 对象属性 // 类似: Person -> name setValue: forKey: // 对象的属性或者 属性的 ...

  6. Freemaker如何遍历key为non-string类型的map?

    (一) 前置知识 Freemaker默认配置下会使用SimpleHash去包装后台传递的hashmap,下段摘抄自官方reference 同样,当你传递进去一个hashmap实例时,会替换为一个sim ...

  7. LGPL 与GPL的区别

    GPL(GNU General Public License) 我们很熟悉的Linux就是采用了GPL.GPL协议和BSD, Apache Licence等鼓励代码重用的许可很不一样.GPL的出发点是 ...

  8. php琐碎

    1.类中的常量,可以用类来引用: class MyClass() { const SUCCESS ="success"; const FAIL ="fail"; ...

  9. 以太坊go-ethereum客户端(三)两种全节点启动模式

    这篇博客介绍一下go-ethereum全节点的两种启动模式:主网络快速启动和测试网络快速启动.这也是客户端所提供的两种启动方式,直接拿来使用即可.下面具体介绍一下使用方法. 主网络快速启动 其实,我们 ...

  10. python基础(12)--初识Socket

    socket: 网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket. Socket的英文原义是“孔”或“插座”.作为BSD UNIX的进程通信机制,取后一种意思. ...