首先看看题吧。毕竟花了一晚上没做出(超时)肯定是算法不行了。越错我就越来越膜拜那些dalao们呐
先%lyric_seraph 大神 (1unsigned long long << 63)-1次!!
BF时间限制:2000MS 内存限制:65535K
Description不知道看到标题的大家觉得这个是有关什么的题目呢,估计会认为是Boy Friend的缩写之类的吧。嗯,其实我想表达的是Brainfuck_(:з」∠)_。 Brainfuck是一种编程语言,虽然它很难看懂,但是它可以完成任何计算操作。 下面说明摘自wiki。 这个语言是基于一个简单的机器模型,除了指令,这个机器还包括:一个以字节为单位、被初始化为零的数组、一个指向该数组的指针(初始时指向数组的第一个字节)、以及用于输入输出的两个字节流。 整个语言只有8条指令: 字符 含义 > 指针加一 < 指针减一 + 指针指向的字节的值加一 - 指针指向的字节的值减一 . 输出指针指向的单元内容(ASCII码) , 输入内容到指针指向的单元(ASCII码) [ 如果指针指向的单元值为零,向后跳转到对应的]指令的下一指令处 ] 如果指针指向的单元值不为零,向前跳转到对应的[指令的下一指令处 如果把这些指令对应c语言的话,就是下面这张表(ptr是char *类型): BF C > ++ptr; < --ptr; + ++*ptr; - --*ptr; . putchar(*ptr); , *ptr =getchar(); [ while (*ptr) { ] } 好了,说到这里,估计大家都知道这个题目是干什么的了:给出一个Brainfuck程序以及一串输入,请输出对于这串输入的输出结果. 输入格式输入包含两部分,第一部分是Brainfuck源程序(在100000个字符内)包括多行(源程序分析过程中忽略空白字符例如:空格' '、制表符'\t'、换行回车'\n'),以#号表示源程序结束,保 证程序没有语法错误。 #号的下一行整行是输入(在100000个字符以内),如果输入为空,则这行是“NULL”,不包含引号。 输出格式输出这个程序对于对应输入的输出。
输入样例++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++.>+.+++++++..+++.>++.<<+++++++++++++++.>.+++.------.--------.>+.>.# NULL
输出样例Hello World!
提示ps:这里给一段小小的Brainfuck程序出来,其实和测试数据没什么关系,大家能跟我做个约定吗?大家过了这题之后才许运行这段小程序哦~ windows用户请运行这个: ++++++++++++++++[>+++>++++++++++>+++++++++++>++++++++++++>+++++++++++++>++++++++++++++>+++++++++++++++>++++++++++++++++<<<<<<<<-]>>>>++.>>>-. <<<<<+.>-----.>>+++.---.<+.--------.>+++.---.+++++++.>>++.<<-------------.>--------.----.<<+.------.<---.>-.++++++++.>>+++.>---.<<<---.>>>+++ ++.<<------.>+.<<<<++.>>+++++.>++++.>>------------.<<<------.>>>>-----.<<<++.---.<----.>---.<++++++.<++++++++.<.>----.>>++++++.<<<+++.>>----- -.>>++++.<<<<<-.>>>>.<<<.>>>-------..+.>>----.<----------.<<++++++.-----.<<++.>>>++++++.---.<++.>>>>-----.<<<<++.>----.<.<<------.>>>>+++++.- ---.<<<<-.>-.>>+++++.>>++++.<<<-.>>>>+++++.<<<<-------.+++++++++.>++.---.---.+++.>-.<<<+++++++.>>----.<.>>----.----.++.>-----.<<<<<++.>------ .++++++++.>>>>>--------.<<+++++.<<<<++++.>>>>------.<+..>>++++++++.<<<<<----.+++++++++.>>>>++++++++.---.<<-.>>++++++++++++.<<<++.>>>++++.<<<- --.>>++++++++++++.-----------.<<++.<---------.+++++++++.>>>++.>>+.<<<++.>>+.<<<--.>>>-----------.<<<++.>+.>>+.>+++.<<<---.>>>>.<<<<<<-------- ---.++++++++++.# linux/unix用户请运行这个: ++++++++++++++++[>+++>++++++++>+++++++++>++++++++++>+++++++++++>++++++++++++>++++++++++++++>+++++++++++++++<<<<<<<<-]>>>>>>>+++++.<<<-------- .+++.>>>>-.<<---.<<+++.>>>+.<<<--.<-------.>>>>.<<++.<+++++.>>>.<<<-----.<.>>>>+++.<<<<<+.>>>+++.>>----.<<-------.<<-.>>>>++.<---.<--------.> >--.<<++++++++.<--.>>>.<<<<.>>++.>>+.<<<++.<<-.>>>>>-.<<<<++++++++.--.>>>>.<<<<+++.>++++++.>>>>.<<++.<<---.>>>.<<<+++++++.<<++.>>>>>+.<<<---- ----.--.>>>.<<<----.>-.>>+.<<<++.<<++.>>>>>+.<<.<+++.>>>>.<<.<<<-----.>>>>---.<----.<<<----.>>>>.<++++.<<++.<<<-.>>>>>>.<----.<<<.>>>>.<<<+++ ++++.>>+.>-.<++++.<<------.>>>.<-----.<<<<----.>>>>>+.<<-.<------.>>>+.<<<--.>+.>>--.<.<-----.>>+.<<-----.>+++++.>.<<++++++++.----.>>.<<++++. <--------.>>>>.<<.<<++++++++++++++.>>>.<<-------.<<<++.>>>>>+.<<<.--.>>>--.<-----.<<<+++++.>>>>++.<<<----.>+++++++++.>>+++.<<<<<.>>++++++++++ +.>>>-----.<+.<<----.>>>++.<<+++.<++.>>>+++.<<<----------.>----.>>.<<<+++++++++++.----------.>>>>.<<+++.<<<-.>>>>----.<<----------.+++.>>.<<+ +++++.-------.>>.<<<+++..>>>.<---.-----.>>.<<++++++++.<<<.>>>>+.<<<+.<---.>>>>-.<++.<<<-.>>>>.<<--.<--.>>>+.<<<<+.>>>+.>++.<<+++++++++++.>--- --.>>.<<++.<<<+++.>>>>.<<.>-----.>---.<<<+++.---.>>>+.<<<<.<-.>>>>>-.<<<<----.>>+.>>+.<<<++.<<-.>>>>>-.<<<<++++++++.--.>>>>>.<<++++++.<<++.#
作者lyric_seraph |
#include <cstdio>
#include <cstring>
#include <queue>
#include <stack>
#include <iostream>
#include <bitset>
#include <algorithm>
using namespace std;
const int sm=1000005;
char Brainfuck[sm];
char input[sm];
char output[sm];
int pre_mark[sm],last_mark[sm],p=0,l=0;
int main() {
int mark=0,mark2=0;
char c;
while((c=getchar())!='#'){
if(c==' '||c=='\t'||c=='\n');
else {
if(mark>=1&&c=='-'&&Brainfuck[mark-1]=='+'||mark>=1&&c=='+'&&Brainfuck[mark-1]=='-')
--mark;
else if(mark>=1&&c=='<'&&Brainfuck[mark-1]=='>'||mark>=1&&c=='>'&&Brainfuck[mark-1]=='<')
--mark;
else{
if(c=='[')pre_mark[p++]=mark;
else if(c==']')last_mark[l++]=mark;
Brainfuck[mark++]=c;
}
}
}
getchar();
gets(input);
char *ptr=output;
stack<int> loc;
for(int i=0;i<mark;++i)
{
switch(Brainfuck[i]){
case '>':++ptr;break;
case '<':--ptr;break;
case '+':++*ptr;break;
case '-':--*ptr;break;
case '.':putchar(*ptr);break;
case ',':*ptr=input[mark2++];break;
case '[':if(!*ptr){int c=0;while(Brainfuck[i]!=']'&&i<mark||c&&i<mark){if(Brainfuck[i]=='[')++c;++i;if(Brainfuck[i]==']')--c;}}
else loc.push(i);
break;
case ']':if(*ptr)i=loc.top();else loc.pop();break;
}
}
return 0;
}
询问某位大佬时,他说:“实在不会那就不做了。”的确,与其消耗在此,不如趁机多学习自己能力范围内的知识,迟早有一天,就能做出来了。