状态题目:ByteLand电脑语言
题目编号:376-ByteLand电脑语言 查看该题
状态: Unaccepted
测评机: Xeost[5]
得分: 90分
提交日期: 2008-11-2 23:38:00
有效耗时: 626毫秒
测试结果1: 通过本测试点|有效耗时172:ms
测试结果2: 通过本测试点|有效耗时63:ms
测试结果3: 输出过少|用户输出数据少于标准输出的50%[标准输出16位|选手输出2位]
测试结果4: 通过本测试点|有效耗时47:ms
测试结果5: 通过本测试点|有效耗时47:ms
测试结果6: 通过本测试点|有效耗时63:ms
测试结果7: 通过本测试点|有效耗时62:ms
测试结果8: 通过本测试点|有效耗时62:ms
测试结果9: 通过本测试点|有效耗时63:ms
测试结果10: 通过本测试点|有效耗时47:ms
查看状态 Show Status
状态题目:ByteLand电脑语言
题目编号:376-ByteLand电脑语言 查看该题
状态: Accepted
测评机: Xeost[5]
得分: 100分
提交日期: 2009-10-22 20:14:00
有效耗时: 531毫秒
测试结果1: 通过本测试点|有效耗时109ms
测试结果2: 通过本测试点|有效耗时47ms
测试结果3: 通过本测试点|有效耗时47ms
测试结果4: 通过本测试点|有效耗时47ms
测试结果5: 通过本测试点|有效耗时47ms
测试结果6: 通过本测试点|有效耗时47ms
测试结果7: 通过本测试点|有效耗时47ms
测试结果8: 通过本测试点|有效耗时46ms
测试结果9: 通过本测试点|有效耗时47ms
测试结果10: 通过本测试点|有效耗时47ms
提交代码: /*
查看题目 Show Problem
题目:ByteLand电脑语言
问题编号:376 [提交该题] [讨论该问题] [有关讨论] [Who AC] [相关题解] [最优解]
My Flag:Unsubmited
题目类型
其它
描述
ByteLand的人像地球人学习弄了种ByteLand PC语言。
这种语言其实就是DAM语言。
有个机器执行一种DAM语言。
该机器有一个栈,初始时栈里只有一个元素x,随着DAM语言程序的执行,栈里的元素会发生变化。
DAM语言有四种指令:
D指令:把栈顶元素复制一次加到栈顶
A指令:把栈顶元素取出,加到新的栈顶元素中。
M指令:把栈顶元素取出,乘到新的栈顶元素中。
如果执行A或M指令的时候栈内只有一个元素,则机器会发出错误信息。
如果程序无误,那么执行完毕以后,栈顶元素应该是x的多项式,例如,程序DADDMA的执行情况为(栈内元素按照从底到顶的顺序从左至右排列,用逗号隔开):
x→ x,x→2x→2x,2x→ 2x,2x,2x→ 2x,4x^2 →4x^2+2x
给出一段DAM程序,求出执行完毕后栈顶元素。
输入格式
输入:
仅一行,包含一个不空的字符串s,长度不超过12,代表一段DAM程序。
输入程序保证合法且不会导致错误。
输出格式
输出:
输出一行,即栈顶多项式。
须按照习惯写法降幂输出,即:
等于1的系数不要打印,系数为0的项不打印,第一项不打印正号。
一次方不打印’^1’。
样例输入
DADDMA
样例输出
4x^2+2x
*/
#include<iostream>
#include<memory.h>
using namespace std;
struct rec{
__int64 a[100];
rec(){
memset(a,0,sizeof(a));
}
void r_add(int x,__int64 y){
a[x]+=y;
}
void mul(){
for (int i=0;i<100;++i) a[i]<<=1;
}
void output(){
bool first=true;
for (int i=99;i!=0;--i){
if (a[i]==0) continue;
if (!first) cout<<"+";
if (a[i]!=1) cout<<a[i];
cout<<"x";
if (i!=1) cout<<"^"<<i;
first=false;
}
cout<<endl;
}
};
rec stk[24];
int top;
void D(){
stk[top]=stk[top-1];
++top;
}
void A(){
rec a=stk[--top];
for (int i=0;i<100;++i) stk[top-1].r_add(i,a.a[i]);
}
void M(){
rec a=stk[--top];
rec b=stk[--top];
rec c;
for (int i=0;i<100;++i){
if (a.a[i]==0) continue;
for (int j=0;j<100;++j){
if (b.a[j]==0) continue;
c.r_add(i+j,a.a[i]*b.a[j]);
}
}
stk[top++]=c;
}
int main (void){
string s;
cin>>s;
top=1;
stk[0].r_add(1,1);
for (int i=0;i<s.size();++i){
if (s[i]==’D’) D();
if (s[i]==’A’) A();
if (s[i]==’M’) M();
}
stk[top-1].output();
// while (1);
return 0;
}
program ss;
type a=record
mi:array[1..100] of int64;
end;
var s:array[1..100] of a;
b:a;
i,j,k,m,n,t,top:longint;
ch:char;
ans,st:string;
begin
fillchar(s,sizeof(s),0);
top:=1; s[1].mi[1]:=1;
while not eoln do
begin
read(ch);
case ch of
'D':begin inc(top); s[top]:=s[top-1]; end;
'A':begin
for i:=1 to 100 do inc(s[top-1].mi[i],s[top].mi[i]);
fillchar(s[top],sizeof(s[top]),0); dec(top);
end;
'M':begin
fillchar(b,sizeof(b),0);
for i:=1 to 50 do
for j:=1 to 50 do inc(b.mi[i+j],s[top-1].mi[i]*s[top].mi[j]);
fillchar(s[top],sizeof(s[top]),0);
dec(top); s[top]:=b;
end;
end;
end;
ans:='';
for i:=100 downto 1 do
if s[top].mi[i]>0 then
begin
str(s[top].mi[i],st);
if s[top].mi[i]>1 then ans:=ans+st+'x' else ans:=ans+'x';
if i>1 then begin str(i,st); ans:=ans+'^'+st; end;
ans:=ans+'+';
end;
writeln(copy(ans,1,length(ans)-1));
end.