Problem - K - Codeforces
思路: 首先我们能够想到,如果两头的如果已经匹配了,那么我一定就不用进行反转了,那么就是首先找到一个不匹配的区间l,r然后我们通过翻转某一个区间使得这个区间变为回文串,并且我们能够发现翻转的区间一定是包含某个端点的,因为如果不包含端点,因为端点是不匹配的,翻转之后仍然是不匹配的,那么我们就可以直接枚举从l开头的所有串,以及以r结尾的所有串,然后看它们在翻转之后是否是一个回文串,而这个判断的话可以用字符串哈希解决
比如说列举一种情况我们将[l,i]翻转,那么正向的哈希值代表,query_zheng(l,r)-query_zheng(l,i)*P[r-i]+query_fan(l,i)*P[r-i],即首先我得到这整个串的正向哈希,然后我要减去前缀,因为前缀在[l,r]的哈希中被乘了P[r-i]次,所以在减去的时候需要对介,同理在加上的时候因为要加在最前面,所以也要对界的加上
// Problem: K. 子串翻转回文串
// Contest: Codeforces - 2020 CCPC Henan Provincial Collegiate Programming Contest
// URL: https://codeforces.com/gym/104095/problem/K
// Memory Limit: 512 MB
// Time Limit: 1000 ms
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include