标签:xpl sse gnu sso \n ali bst stop with
Input
Output
Sample Input
abcbabcbabcba abacacbaaaab END
Sample Output
Case 1: 13 Case 2: 6
思路:求一个字符串的最长回文子串,manacher算法或者预处理前后缀hash值二分求解。我写的manacher。
1 #include <iostream> 2 #include <fstream> 3 #include <sstream> 4 #include <cstdlib> 5 #include <cstdio> 6 #include <cmath> 7 #include <string> 8 #include <cstring> 9 #include <algorithm> 10 #include <queue> 11 #include <stack> 12 #include <vector> 13 #include <set> 14 #include <map> 15 #include <list> 16 #include <iomanip> 17 #include <cctype> 18 #include <cassert> 19 #include <bitset> 20 #include <ctime> 21 22 using namespace std; 23 24 #define pau system("pause") 25 #define ll long long 26 #define pii pair<int, int> 27 #define pb push_back 28 #define mp make_pair 29 #define clr(a, x) memset(a, x, sizeof(a)) 30 31 const double pi = acos(-1.0); 32 const int INF = 0x3f3f3f3f; 33 const int MOD = 1e9 + 7; 34 const double EPS = 1e-9; 35 36 /* 37 #include <ext/pb_ds/assoc_container.hpp> 38 #include <ext/pb_ds/tree_policy.hpp> 39 40 using namespace __gnu_pbds; 41 tree<pli, null_type, greater<pli>, rb_tree_tag, tree_order_statistics_node_update> T; 42 */ 43 44 char s[1000015], t[2000015]; 45 int ls, lt, p[2000015]; 46 void get_t() { 47 t[0] = ‘@‘; 48 ls = strlen(s + 1); 49 for (int i = 1; i <= ls; ++i) { 50 t[(i << 1) - 1] = ‘#‘; 51 t[i << 1] = s[i]; 52 } 53 t[ls << 1 | 1] = ‘#‘; 54 lt = ls << 1 | 1; 55 t[lt + 1] = 0; 56 } 57 int get_maxlen() { 58 get_t(); 59 int mi = 1, mx = 1, res = 0; 60 p[1] = 1; 61 for (int i = 2; i <= lt; ++i) { 62 if (i <= mx) { 63 p[i] = min(mx - i + 1, p[2 * mi - i]); 64 } else { 65 p[i] = 1; 66 } 67 while (t[i - p[i]] == t[i + p[i]]) ++p[i]; 68 if (mx < i + p[i]) { 69 mi = i; 70 mx = i + p[i]; 71 } 72 res = max(res, p[i] - 1); 73 } 74 return res; 75 } 76 int main() { 77 for (int ca = 1; scanf("%s", s + 1) && strcmp(s + 1, "END"); ++ca) { 78 printf("Case %d: %d\n", ca, get_maxlen()); 79 } 80 return 0; 81 }
标签:xpl sse gnu sso \n ali bst stop with
原文地址:https://www.cnblogs.com/BIGTOM/p/8876252.html