17999 Light-bot 模拟 + kmp求循环节
http://acm.scau.edu.cn:8000/uoj/mainMenu.html
17999 Light-bot
时间限制:1000MS 内存限制:65535K
提交次数:0 通过次数:0
题型: 编程题 语言: 不限定
Description
I (you needn't know
who am "I".) am currently playing a game called
"Light-bot". In the game, the "Light-bot" is controlled
by a program. The
program includes:
(1) The main
procedure. The main procedure is the entrance of the program, same as the
"main" in C/C++.
(2) Sub procedure
#1. Sub procedure No.1.
(3) Sub procedure
#2. Sub procedure No.2.
Note: If a sub
procedure ends, it will return to the command next to it's calling place.
Here, we suggest
that an alphabetical letter stands for an ACTION COMMAND excluding ‘P’ and ‘p’.
So,
"Light-bot" will begin executing from the first command in the main
procedure. Once it meets with a letter ‘P’, it will call sub
procedure #1, while
a letter ‘p’ indicates to call sub procedure #2. The main procedure, procedure
#1 and procedure #2 can call
procedure #1 or
procedure #2 freely. It means that recursive calls are possible.
Now, I just want to
know given a program, what’s the Nth ACTION COMMAND light-bot will execute.
输入格式
The first line of
the input contains an integer T (T <= 1000), indicating there are T cases in
the input file.
For each test case,
the first line is the main procedure. The second one is sub procedure #1 and
the last is sub procedure #2. Each
procedure ends with
a ‘#’ sign, which is not considered a command. The length of a part will not
exceed 10.
And on the next
line, there is one integer n (1 <= n <= 108), indicates the
order I ask. It is GUARANTEED that there must be an ACTION COMMAND
fitting the requirement.
Please see the
example for more details.
输出格式
For each case,
print one line, the ACTION COMMAND letter that fits the description.
输入样例
4
ABCDP#
pEFG#
HIJK#
4
ABCDP#
pEFG#
HIJK#
5
ABCDP#
pEFG#
HIJK#
9
ABCDP#
EFGHP#
#
12
输出样例
D
H
E
H
来源
Lrc_seraph
首先因为其最大的数量是1000(不循环的话)
那么我可以暴力模拟2000次,然后得到一个序列。这个序列的后边肯定是循环的了。
就是XXXXABCABCABC....这样。
然后可以反向kmp一次,求循环节的时候,要从第100项开始,
原因是:
1、第100项开始,求到的循环节长度是一样的,
2、防止AAAA这些假循环节的干扰。
坑了我很久的就是模拟的时候,我模拟到up步,但是取了等号,模拟了UP + 1步。然后一直wa
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <algorithm>
#define IOS ios::sync_with_stdio(false)
using namespace std;
#define inf (0x3f3f3f3f)
typedef long long int LL; #include <iostream>
#include <sstream>
#include <vector>
#include <set>
#include <map>
#include <queue>
#include <string>
char str[][];
char Ma[];
int len[];
int lenMa;
const int up = + ;
char all[up + ];
int lenall = ;
char sub[up + ];
int lensub = ;
void dfs(int now, int cur) {
if (lenall >= up) return;
for (int i = cur; i <= len[now] && lenall < up; ++i) {
if (str[now][i] == 'P') {
dfs(, );
} else if (str[now][i] == 'p') {
dfs(, );
} else all[++lenall] = str[now][i];
}
}
int tonext[up + ];
void kmp() {
int i = , j = ;
tonext[] = ;
while (i <= lensub) {
if (j == || sub[i] == sub[j]) {
tonext[++i] = ++j;
} else j = tonext[j];
}
}
void work() {
scanf("%s", Ma + );
for (int i = ; i <= ; ++i) {
scanf("%s", str[i] + );
len[i] = strlen(str[i] + );
len[i]--;
}
lenMa = strlen(Ma + );
lenMa--;
lenall = ;
for (int i = ; i <= lenMa && lenall < up; ++i) { //这个up不能去等号
if (Ma[i] == 'P') {
dfs(, );
} else if (Ma[i] == 'p') {
dfs(, );
} else {
all[++lenall] = Ma[i];
}
}
all[lenall + ] = '\0';
int val;
scanf("%d", &val);
if (val <= up) {
printf("%c\n", all[val]);
return;
}
lensub = ;
for (int i = lenall; i >= ; --i) {
sub[++lensub] = all[i];
}
sub[lensub + ] = '\0';
kmp();
// cout << sub + 1 << endl;
int cir = ;
// cout << all + 1 << endl;
for (int i = + ; i <= lensub; ++i) {
if (tonext[i + ] == ) continue;
int t = i - (tonext[i + ] - );
if (i % t == ) {
cir = t;
// cout << i << endl;
break;
}
}
// cout << cir << endl;
if (cir == ) while();
int left = val - up; left %= cir;
if (left == ) left = cir;
int point = lenall - cir + left;
printf("%c\n", all[point]); } int main() {
#ifdef local
freopen("data.txt","r",stdin);
#endif
int t;
scanf("%d", &t);
while (t--) work();
return ;
}
17999 Light-bot 模拟 + kmp求循环节的更多相关文章
- hdu 3374 String Problem (字符串最小最大表示 + KMP求循环节)
Problem - 3374 KMP求循环节. http://www.cnblogs.com/wuyiqi/archive/2012/01/06/2314078.html 循环节推导的证明相当 ...
- UVA 12012 Detection of Extraterrestrial(KMP求循环节)
题目描述 E.T. Inc. employs Maryanna as alien signal researcher. To identify possible alien signals and b ...
- 51nod 1126 求递推序列的第N项 思路:递推模拟,求循环节。详细注释
题目: 看起来比较难,范围10^9 O(n)都过不了,但是仅仅是看起来.(虽然我WA了7次 TLE了3次,被自己蠢哭) 我们观察到 0 <= f[i] <= 6 就简单了,就像小学初中学的 ...
- 【HDU 3746】Simpsons’ Hidden Talents(KMP求循环节)
求next数组,(一般有两种,求循环节用的见代码)求出循环节的长度. #include <cstdio> #define N 100005 int n,next[N]; char s[N] ...
- hdu3746 kmp求循环节
CC always becomes very depressed at the end of this month, he has checked his credit card yesterday, ...
- HDU3746(KMP求循环节)
Cyclic Nacklace Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)T ...
- hdu 3746 kmp求循环节
题意就是将所给的字符串变成多个完整的循环(至少两个),然后给出最少需要添加的字符数.
- hdu1358 Period kmp求循环节
链接 http://acm.hdu.edu.cn/showproblem.php?pid=1358 思路 当初shenben学长暑假讲过,当初太笨了,noip前几天才理解过来.. 我也没啥好说的 代码 ...
- (KMP 求循环节)The Minimum Length
http://acm.hust.edu.cn/vjudge/contest/view.action?cid=70325#problem/F The Minimum Length Time Limit: ...
随机推荐
- 小trick之mklink
因为要看很多论文就下载安装了zotero,又因为文献库的文件夹在安装目录太深,找起来太麻烦,再加上是软件本身的安装目录,因此把论文都下载在默认文件中总会天然地产生不安全感,万一误删软件怎么办.所以在文 ...
- Notepad++安装xml插件
环境: win7 64位 Notepad++7.3.3 原生的Notepad++不自带xml文件的插件,所以在显示xml文件时并不分行(如下图所示),对于用户编辑,查看的操作而言,并不友好,所以需要安 ...
- 插入排序(InsertionSort)
位置p上的元素存储于tmp(第一趟p通常取1),而(位置p之前)所有更大的元素都向右移动一个位置. 然后tmp被放在正确的位置上. 代码: public class InsertionSort { p ...
- HihoCoder 1640 : 命名的烦恼(预处理)
描述 程序员常常需要给变量命名.给函数命名.给项目命名.给团队命名…… 好的名字可以大大提高程序员的主观能动性,所以很多程序员在起名时都会陷入纠结和烦恼. 小Hi希望给新的项目起个拉风的名字.他希望这 ...
- codevs 2102 石子归并2
传送门 2102 石子归并 2 时间限制: 10 s 空间限制: 256000 KB 题目等级 : 黄金 Gold 题目描述 Description 在一个园形操场的四周摆放N堆石子,现要将 ...
- 安装tensorflow-gpu出现的问题
1.Could not install packages due to an EnvironmentError: [Errno 13] Permission denied: '/usr/local/l ...
- 级联MobileNet-V2实现CelebA人脸关键点检测(转)
https://blog.csdn.net/u011995719/article/details/79435615
- 深度技术Win7系统利用diskpart命令实现硬盘分区的技巧
转自:http://www.xitongcheng.com/jiaocheng/win7_article_2491.html 1. 深度技术Win7系统利用diskpart命令实现硬盘分区的技巧分享给 ...
- Java: JavaMail 初试(一)
前言:以前的我,很喜欢写东西,写一写所想所见所闻所感,但是工作之后,总不能写出让自己满意的文章,突发奇想,能否利用写博客的时机,将其写成类似散文似的博文呢?哈哈... 邮件功能尝试:作为一个小菜鸟,对 ...
- 1.16 sqoop options-file参数进行运行任务
sqoop的options-file参数可以像hive的-f 参数那样,执行一个脚本文件,而不是直接在命令行执行: 其中,此脚本文件要遵循一定的格式:参考链接:http://sqoop.apache. ...