题意:
判断是否能将字符串S分成三段非空回文串。
思路:
先预处理出前缀回文串和后缀回文串的位置,将位置分别装入两个集合中,O(n)。
针对每个前缀回文串的终点位置,挑出不相交的后缀回文串,对中间那段进行暴力匹配即可。只有20个case,不会超时的。
具体的算法参考HIHOCODER HIHO一下 第一周 #1032 : 最长回文子串 (特殊处理)
1 //#include <bits/stdc++.h> 2 #include <cstdio> 3 #include <cstring> 4 #include <map> 5 #include <algorithm> 6 #include <set> 7 #include <string> 8 #include <iostream> 9 #include <deque> 10 #include <vector> 11 #define INF 0x7f7f7f7f 12 #define pii pair<int,int> 13 #define LL unsigned long long 14 using namespace std; 15 const int N=20100; 16 int len; //原串长 17 char str[N*2]; //接收原来的串 18 char s[N*2]; 19 int P[N*2]; //保存关于长度的信息(回文长度的一半再加1) 20 vector<int> vect[2]; 21 int cal(int q) 22 { 23 int id=1, mx=1, max1=1; 24 P[0]=1; 25 P[1]=1; 26 for(int i=2; s[i]!='