[分形]GYM-100443

6 篇文章 0 订阅
1 篇文章 0 订阅

第i阶的图形由第i-1阶的图形构成,大概过程直接看题目里的图即可。

然后从图形左端进去,右端出来,中间左拐得到字符L,右拐得到R。走完之后得到一个字符串。现在给定n和字符串S,问字符串S是不是n阶图形字符串的子串。

经观察,所有的i阶图形都是可以被包裹在一个三角形里面,所以复制的时候,两个i-1阶图形这个姿势是不会交叉的(但是可能会有点重合),并且对于俩i-1阶图来说,相当于是从俩方向进入同一个图形,所以,令str(i)表示i阶图形的字符串,str(
i)=str(i-1)+"L"+~rev(str(i-1)),其中rec()表示左右反转一下,~表示原先的L变成R,R变成L。

我们考虑对于i阶图形来说,如果S是它的子串,当S不经过str(i)的中心L可以得到的时候,就变成了一个子问题;如果经过中心,因为S长度<=100,则我们只查询str(i)中间2*len(S)+1位,一定能找到S。

递归做也可以,然,我是自底向上写的。

维护第i阶图形(1<=i<=n)的开头len(S)位,中间2*len(S)+1位,结尾len(S)位,先用KMP看看中间能不能找到S,找不到的话用ed(末尾的)得到第i+1阶图形的中间2*len(S)位,用bg更新第i+1阶图形的ed。其实到了后面就不变了,因为bg永远不变的,但是懒得想太细,更新也不会错不会T就是了。

还有一个细节就是,如果中心找不到,可能在str(i-1)里,也可能在~rev(str(i-1))里,所以呢,第i阶的时候可以得到i-1阶的~rev(str(i-1)),我们直接用str(i-1)和~rev(S)跑KMP匹配一下看看就可以了。注意不能在i-1阶的时候匹配str(i-1)和~rev(S),因为如果i>n了,~rev(str(i-1))是得不到的。

最终复杂度是n*200*T差不多?这个复杂度分析有点草率了=-=

代码的话……vj进不去了,之后能进了再补上吧。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值