码迷,mamicode.com
首页 > 其他好文 > 详细

Codeforces gym Hello 2015 Div1 E

时间:2015-01-09 21:04:34      阅读:262      评论:0      收藏:0      [点我收藏+]

标签:动态最长回文子串   字符串hash   线段树优化   二分搜索   

Codeforces gym Hello 2015 Div1 E
Codeforces gym 100570 problem E
(一种处理动态最长回文子串问题的方法)
Problem
  给一个长度为N的字符串S,字符集是‘a’-‘z‘。进行Q次操作,操作分三种。一,修改位置X的字符为C;二,查询以P位置为中心的最长回文子串的长度,并输出;三,查询以P与P+1的中间位置为中心的最长回文子串的长度,并输出。

More
  第二种操作子串长度为奇数,一定存在;第三种操作子串长度为偶数,若不存在,输出 -1。

Limits
Time Limit(ms): 4000(1s足以)
Memory Limit(MB): 256
N, Q: [1, 10^5]
S[i], C: [‘a‘, ‘z‘]
X, P: [1, N]

Solution
技术分享
(Thanks Fcdkbear

More
  对于第二、三种操作,用hash和二分搜索来查询长度。由于中心位置P给定,所以每次查询复杂度为O(log)*O(hash)。
  用线段树来hash,hash方程为:H(Si+1Si+2...Si+n-1Si+n)=H(Si+1Si+2...S(2i+1+n)/2)*(prime^k)+H(S(2i+1+n)/2+1...Si+n-1Si+n);其中prime为选定的素数,选择10^9+7可以过,k为S(2i+1+n)/2+1...Si+n-1Si+n的长度,即k=(i+n) - ((2i+1+n)/2+1) +1;用上述方程,线段树父亲结点hash值由孩子hash值来维护,即可在O(hash)=O(logN)的复杂度内查询任意一子串的hash值。
  这种字符串hash的方法理论上有风险,但有很大的概率不发成冲突。

Complexity
Time Complexity: O(Q*logN*logN)
Memory Complexity: O(4*N)

Source

Code


Codeforces gym Hello 2015 Div1 E

标签:动态最长回文子串   字符串hash   线段树优化   二分搜索   

原文地址:http://blog.csdn.net/uestc_peterpan/article/details/42557959

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!