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: ...
随机推荐
- java-线程(一)
1.进程与线程的区别 多个进程的内部数据和状态都是完全独立的,而多个线程是共享一块内存空间和一组系统资源,有可能互相影响.多线程程序比多进程程序需要更少的管理费用.进程是重量级的任务,需要分配他们的单 ...
- ubuntu 下编译安装ceph
git clone --recursive https://github.com/ceph/ceph.git cd ceph/ sudo apt-get install libtool sud ...
- distutils 打包setup.py
from distutils.core import setup setup(name='hello', version='1.0', description='test example', auth ...
- HDU1150(最小顶点覆盖)
Machine Schedule Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) ...
- spring : springmvc常用注解标签详解(转)
新的项目,新的学习,好久没用这些注解了,同时在学习使用shiro ,lucene 等等.在网上找了些博文,感谢作者的总结和分享. 欢迎交流,言归正传: 1.@Controller 在SpringMVC ...
- Eclipse中导入Hadoop源代码工程
以hadoop 2.7.3为例, jdk1.7.0_80 , Eclipse Mars(4.5), Apache Maven 3.0.5 mvn时需要使用root权限,即县切换到root用户,用命 ...
- Websocket 学习
一.含义 WebSocket 是一种在单个TCP连接上进行全双工通讯的协议. WebSocket 使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据.在WebSocket ...
- java集合框架之HashCode
参考http://how2j.cn/k/collection/collection-hashcode/371.html List查找的低效率 假设在List中存放着无重复名称,没有顺序的2000000 ...
- POJ 3662 Telephone Lines (二分+dijkstra)
题意: 多年以后,笨笨长大了,成为了电话线布置师.由于地震使得某市的电话线全部损坏,笨笨是负责接到震中市的负责人. 该市周围分布着N(1<=N<=1000)根据1……n顺序编号的废弃的电话 ...
- (水题)Codeforces - 4C - Registration system
https://codeforces.com/problemset/problem/4/C 用来哈希的一道题目,用map也可以强行过,但是性能慢了6倍,说明是在字符串比较的时候花费了接近6倍的时间. ...