题意:
有一个长度为n的字符串,求至多删掉其中一个字符(可以不删),剩下的串的最短循环节(一个串是另一个串的循环节,当且仅当它为将原串无限复制后形成的串的前缀)。
题解:
因为求的是长度,而又不满足单调性,故枚举长度难以避免。考虑枚举一个长度后,如何高效判断其是否合法。先对问题简化:如果不删,那么直接哈希后一段段地判断即可,效率为O(NlnN)。关键在于删的字符在哪里。因为本来在比较时,都是与第一段比较,故考虑若删的字符不在第一段,则后面第一次找到一段与第一段不同的串时,就必须将其删去一个字符(因为若在此之前找到的一段与第一段相同,即使删去一个字符后仍相同,那也不更优)那么如何判断删掉一个后是否合法呢?肯定不能一个个枚举,要高效解决,是否能二分?因为前缀相等是满足单调性的,故用二分找出最长前缀(同理删掉相同前缀中的一个并不更优),删掉后面的一个字符,判断后面剩下的是否相等即可。再考虑若删去的字符在第一个串中,那么第一个串要能够删去一个,使它与后面的一串相等,后面部分按照没有删掉的判断即可。
ssoj4028: 撸串(string)
最新推荐文章于 2020-09-07 21:59:25 发布