1、POJ 3974 Palindrome
题意:求一个长字符串的最长回文子串。
思路:Manacher模板。
1 #include<iostream> 2 #include<algorithm> 3 using namespace std; 4 const int maxn = 1000010; 5 char s[maxn]; 6 char tmp[2 * maxn + 3]; 7 int p[2 * maxn + 2]; 8 int Manacher(char *s,char *tmp,int *p, int &start) 9 {////s原字符串,tmp转换后的字符串,p记录长度 10 //char s[maxn]; 11 //char tmp[2 * maxn + 3]; 12 //int p[2 * maxn + 2]; 13 //将所有可能的奇数 / 偶数长度的回文子串都转换成了奇数长度:在每个字符的两边都插入一个特殊的符号。比如 abba 变成 #a#b#b#a#, aba变成 #a#b#a#。 为了进一步减少编码的复杂度,可以在字符串的开始加入另一个特殊字符,这样就不用特殊处理越界问题,比如$#a#b#a# 14 int n = strlen(s); 15 for (int i = 0; i < 2 * n + 2; i++) 16 { 17 if (i == 0) tmp[i] = '$'; 18 else if (i % 2) tmp[i] = '#'; 19 else tmp[i] = s[i / 2 - 1]; 20 } 21 tmp[2 * n + 2] = '