记录编号 560693 评测结果 AAAA
题目名称 [POJ 3974]最长回文子串 最终得分 100
用户昵称 Gravataryrtiop 是否通过 通过
代码语言 C++ 运行时间 0.326 s
提交时间 2021-05-06 21:10:38 内存使用 27.23 MiB
显示代码纯文本
  1. #include <cstdio>
  2. #include <cstring>
  3. #include <algorithm>
  4. using namespace std;
  5. const int maxn = 2000005;
  6. char S[maxn],s[maxn];
  7. const int p = 131;
  8. int T = 0;
  9. int hash[maxn],pw[maxn],rev[maxn],rpw[maxn];
  10. void work(void) {
  11. memset(hash , 0 , sizeof(hash));
  12. memset(pw , 0 , sizeof(pw));
  13. memset(rev , 0 , sizeof(rev));
  14. memset(rpw , 0 , sizeof(rpw));
  15. memset(s , 0 , sizeof(s));
  16. int len = strlen(S + 1);//manacher
  17. for(int i = 1;i <= len * 2 + 1;++ i) {
  18. if(i & 1) {
  19. s[i] = '*';
  20. }
  21. else {
  22. s[i] = S[i >> 1];
  23. }
  24. }
  25. len = len * 2 + 1;
  26. pw[0] = 1;
  27. for(int i = 1;i <= len;++ i) {
  28. hash[i] = hash[i - 1] * p + (unsigned long long)s[i];
  29. pw[i] = pw[i - 1] * p;
  30. }
  31. pw[len + 1] = 1;
  32. for(int i = len;i;-- i) {
  33. rev[i] = rev[i + 1] * p + (unsigned long long)s[i];
  34. }
  35. int ans = 1;
  36. for(int i = 2;i < len;++ i) {
  37. int lena = min(i , len - i + 1);
  38. int l = 1,r = lena;
  39. while(l <= r) {
  40. int mid = l + r >> 1;
  41. if(hash[i] - hash[i - mid] * pw[mid]
  42. == rev[i] - rev[i + mid] * pw[mid]) {
  43. l = mid + 1;
  44. }
  45. else r = mid - 1;
  46. }
  47. r = (r * 2 - 1) / 2;
  48. ans = max(ans , r);
  49. }
  50. printf("Case %d: %d\n",++T,ans);
  51. return ;
  52. }
  53. int main() {
  54. freopen("palindrome.in","r",stdin);
  55. freopen("palindrome.out","w",stdout);
  56. while(~ scanf("%s",S + 1)) {
  57. if(S[1] == 'E')break ;
  58. work();
  59. }
  60. fclose(stdin);
  61. fclose(stdout);
  62. return 0;
  63. }