POJ 2758 Checking the text
Wind's birthday is approaching. In order to buy a really really fantastic gift for her, Jiajia has to take a boring yet money-making job - a text checker. This job is very humdrum. Jiajia will be given a string of text what is English letters and he must count the maximum number of letters that can be matched, starting from two position of the current text simultanously. The matching proceeds from left to right, one character by one. Even worse, sometimes the boss will insert some characters before, after or within the text. Jiajia wants to write a program to do his job automatically, this program should be fast enough, because there are only few days to Wind's birthday. Input The first line of input file contains initial text. The second line contains then number of commands n. And the following n lines describe each command. There are two formats of commands: I ch p: Insert a character ch before the p-th. if p is larger than the current length of text, then insert at end of the text. Q i j: Ask the length of matching started from the i-th and j-th character of the initial text, which doesn't include the inserted characters. You can assume that the length of initial text will not exceed 50000, the number of I command will not exceed 200, the number of Q command will not exceed 20000. Output Print one line for each Q command, contain the max length of matching. Sample Input abaab 5 Q 1 2 Q 1 3 I a 2 Q 1 2 Q 1 3 Sample Output 0 1 0 3
题意大概是,可以对字符串进行两种操作,插入数据和查询。查询是给定字符串的两个位置i、j,依次由左至右比较matching的子串,求该子串最大长度。起始的i、j不包括后插入的字符,即为字符的初始位置。
开始思路是,建一个flag数组标记初始位置,插入的字符flag的值是插入前一位字符的flag值。然后暴力插入、暴力查询。比较尴尬的是,数组长度50000+,command 20000+, 暴力查询O(n^2)肯定超时。 超过10000的数据应该只考虑O(nlog(n))的做法,O(n^2)适合1000左右的数据。所以改为暴力插入、二分查询。查询的部分不能超过log(n),之前加了两个O(n)的while结果TLE,所以修改flag作为索引,flag[i]里存初始第i个在数组里的实际位置,O(1)查找。
超级恶心的是,题目需要区分初始位置(查询的时候),但是插入的时候好像不考虑初始位置。因为一直WA,试了很多诡异的数据,“abaab\n5\nI a 10\nI b 10\nQ 1 6”这组估计可以hack了。题目有毒。

浙公网安备 33010602011771号