jzoj6634. 【USACO 2017 US Open Platinum】Problem 3 COWBASIC

Description

Bessie研制出了一种新的编程语言,但是因为还没有设计编译器的缘故,她需要你的帮助来运行她编的程序。
COWBASIC语言是一种简单的、优美的语言。它有两个关键功能:变量相加和MOO循环。对于可能的溢出问题,Bessie想出了一个很好的方法,所有的变量加法都要以10^9+7为模。但是Bessie设计的COWBASIC语言中真正成功之处是可以运行一段固定数量的代码的MOO循环。MOO循环和加法是可以嵌套的。
给你一段COWBASIC程序,请你帮助Bessie确定这个程序段将会返回什么数值。

Input

你将会得到一段最长为100行的COWBASIC程序,每行的长度最长为350个字符。COWBASIC语言的结构和类型如下所述:
这是COWBASIC语言的三种主要结构:
<变量>=<表达式> //赋值结构

<数字(循环次数)>MOO{ //循环结构

<一系列的表达式(也就是循环部分)>

} RETURN <变量> //输出结构 把return的变量输出就行了

这是COWBASIC语言的三种类型(我是这么理解的)

<数字> 这些数字是小于100,000正整数

<变量> 这些变量名字是一串10个以内的小写英文字母

(<表达式>)+(<表达式>) //注意:这是COWBASIC中变量加法的表达方法,详见样例

我们保证返回的变量是已定义的,RETURN(输出结构)将只会出现一次且在程序的最后一行。

Output

输出返回的变量值(有符号的整形数字)

Sample Input
输入样例1:
x = 1
10 MOO {
x = ( x ) + ( x )
}
RETURN x

输入样例2:
n = 1
nsq = 1
100000 MOO {
100000 MOO {
nsq = ( nsq ) + ( ( n ) + ( ( n ) + ( 1 ) ) )
n = ( n ) + ( 1 )
}
}
RETURN nsq

Sample Output
输出样例1:
1024
​输出样例2:
4761

Data Constraint

评分标准
20%数据:MOO循环不嵌套
另外20%数据:程序只有一个变量,MOO循环可嵌套
其他数据没有多余限制(即最长100行,每行最长350字符)

赛时

表示比赛的时候没太多时间来整这题了。
当时初略的想是一道炒鸡马饭的字符串处理题+矩阵优化。
感觉思路比较简单,写起来3、4k的亚子。
然后就懒得写了

题解

有一说一,我是一个还没写出来就在这里口胡的db。

首先我们可以发现变量出现的次数不会太多,就算太多那么循环也不会太多 (平衡规划,雾

那么我们就把所有的变量都拉出来,假设有n个。
然后我们就可以弄出个n*n的矩阵。

接下来我们就一步一步往循环里面钻。
其中我们可以手动打一个栈来维护,比较方便。

那么假设我们遇到一个没有再嵌套循环的循环(禁止套娃),我们可以把里面的变量之间的相互贡献搞成矩阵的新式。
然后就矩阵快速幂。

那么这样我们就做到了把一个循环给消灭掉了。
接着这样一步一步消灭下去,我们就得到了若干个矩阵。
然后把他们再×起来就差不多可以了。

其实其中主要的困难在于极其繁琐的字符串维护。
(等等,这不能成为你不写的借口。

时间的话其实还是很良心的。
矩阵最大为100,然后每个循环log次最大也是17。
组合起来其实最大也跑不满1亿。
就看常数丑不丑了。

代码

待更

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值