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: ...
随机推荐
- hdu 1205 吃糖果(抽屉原理)
题意:N种糖果,不能把一样的放在一起吃,即第一次吃一种,下一次吃另一种. 思路:找到个数最多的糖果种类(最大的数目记作 ma,该糖果种类记为a),首先把这n个糖果放到n个抽屉里面,然后把剩余的N-1种 ...
- tensorflow实现图像的翻转
from:https://blog.csdn.net/uestc_c2_403/article/details/72703097 tensorflow内部含有实现图像翻转的函数为 tf.image.f ...
- php数组合并
php的数合并函数: array_merge($arr1, $arr2, ..., $arr{$n}); 如果数组的键名有重复,后面的会覆盖前面的. 如果键名是数字索引,则会重新排列索引,往后累加. ...
- !function(){}()和function(){}()区别
控制台打印结果如下所示,接下来看一下具体运行,参考https://swordair.com/function-and-exclamation-mark/: 让一个函数声明语句变成了一个表达式
- LC_MESSAGES、语言文件po和mo互相转换
LANGUAGE, LC_ALL, LC_MESSAGES, LANG zz- - 关于这几个环境变量一般认为它们的作用是用来指定程序用户界面语言而且这几个环境变量的优先级是从左到右依次降低的大概 ...
- liunx下解压压缩命令详细介绍
Linux下的压缩解压缩命令详解及实例 实例:压缩服务器上当前目录的内容为xxx.zip文件 zip -r xxx.zip ./* 解压zip文件到当前目录 unzip filename.zip == ...
- JavaScript 日期处理类库 moment
可以自定义自己需要的时间格式,中文文档如下: http://momentjs.cn/ http://momentjs.cn/docs/
- win10 下安装linux子系统
一.开发人员选项 打开控制面板->程序与功能->启用或关闭windows功能 勾选 [适用于linux的windows子系统] 选项 打开win10设置 找到更新与安全 启动开 ...
- 12306.cn网站自动登录器源代码
去年过年放假的时候写了一个12306.cn网站的自动登录器,刚好那时候放假了,所以没把源代码放出来,现在将代码发出来,由于编写得比较仓促(从放假的下午19:00左右到晚上到00:00左右),很多细节问 ...
- shell函数(调用、返回值,返回值获取)
Shell函数返回值,常用的两种方式:return,echo 1) return 语句shell函数的返回值,可以和其他语言的返回值一样,通过return语句返回.示例1: [devadmin@swa ...