线段树 + 字符串Hash - Codeforces 580E Kefa and Watch

  Kefa and Watch

Problem's Link


 

Mean: 

给你一个长度为n的字符串s,有两种操作:

1 L R C : 把s[l,r]全部变为c;

2 L R d : 询问s[l,r]是否是周期为d的重复串。

analyse:

n最大为1e5,且m+k最大也为1e5,这就要求操作1和操作2都要采用logn的算法,所以用线段树.

对于更新操作,使用区间更新就可解决。

主要是如何在logn的时间内完成询问操作.

我们采用线段树维护hash值的方法.

结合于类似KMP的性质,我们发现,字符串[l,r]有长度为w的循环节,只需要使得[l,r-w]=[l+w,r]即可。证明过程看这里

这题的hash不同于普通的字符串hash,因为涉及到动态修改,所以需要预先处理出所有的base,在修改的时候直接用.

Time complexity: O(N)

 

view code

 

你可能感兴趣的:(线段树 + 字符串Hash - Codeforces 580E Kefa and Watch)