Extend to Palindrome (顺序Hash和逆序Hash处理回文)

Posted -ackerman

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Extend to Palindrome (顺序Hash和逆序Hash处理回文)相关的知识,希望对你有一定的参考价值。

题目链接:https://vjudge.net/contest/344930#problem/E

 

题目大意:给出一个字符串,在末尾补充最少的字母,使其整个成为一个回文串

 

题目思路:对字符串进行顺序Hash和逆序Hash,然后去枚举位置,如果此时顺序的Hash和逆序的Hash值想等就说明此时是一个回文串。然后就直接输出该回文串前面的部分,再输出该回文串。如果没有回文串,那么就使整个字符串成为回文串

 

 1 #include <stdio.h>
 2 #include <algorithm>
 3 #include <iostream>
 4 #include <stdlib.h>
 5 #include <string>
 6 #include <string.h>
 7 #include <math.h>
 8 #include <vector>
 9 #include <queue>
10 #include <stack>
11 #include <map>
12 #include <set>
13 
14 
15 #define INF 0x3f3f3f3f
16 #define LL long long
17 
18 typedef unsigned long long ull;
19 const int maxn = 1e5+10;
20 
21 char s[maxn];
22 ull base = 131;
23 ull mod = 1e9+7;
24 ull p[maxn];
25 ull h1[maxn],h2[maxn];
26 ull q[maxn];
27 
28 
29 ull get_hash(ull h[],int l,int r){
30     return (h[r] - h[l-1]*p[r-l+1]);
31 }
32 
33 // amanap lanacanal panama
34 
35 int main() {
36     p[0] = 1;
37     for (int i=1;i<maxn;i++) {
38         p[i] = p[i-1] * base;
39     }
40     while (std::cin >> s+1) {
41         int len = strlen(s+1);
42         memset(h1,0, sizeof(h1));
43         memset(h2,0, sizeof(h2));
44         for (int i=1;i<=len;i++) {
45             h1[i] = h1[i-1] * base + s[i] - a;
46         }
47         for (int i=len;i>=1;i--) {
48             h2[i] = h2[i+1] * base + s[i] - a;
49         }
50         bool flag = false;
51         for (int i=1;i<=len;i++) {
52             if (get_hash(h1,i,len) == h2[i]) {
53                 flag = true;
54                 for (int k=1;k<=len;k++) {
55                     std::cout << s[k];
56                 }
57                 for (int k=i-1;k>=1;k--) {
58                     std::cout << s[k];
59                 }
60                 break;
61             }
62         }
63         if (!flag) {
64             for (int i=1;i<=len;i++) {
65                 std::cout << s[i];
66             }
67             for (int i=len-1;i>=1;i--) {
68                 std::cout << s[i];
69             }
70         }
71         std::cout << std::endl;
72     }
73     return 0;
74 }

 

以上是关于Extend to Palindrome (顺序Hash和逆序Hash处理回文)的主要内容,如果未能解决你的问题,请参考以下文章

UVA 11475 Extend to Palindrome

UVa 11475 - Extend to Palindrome

UVA 11475 Extend to Palindrome(hash)题解

Extend to Palindrome UVA - 11475 (后缀数组)

UVA 11475 Extend to Palindrome(后缀数组+ST表)

Leetcode 题目整理-3 Palindrome Number & Roman to Integer