2021.01.29
hash
代码:
#include<cstdio>
#include<stdlib.h>
#include<string.h>
#include<string>
#include<map>
#include<cmath>
#include<iostream>
#include <queue>
#include <stack>
#include<algorithm>
#include<set>
using namespace std;
typedef unsigned long long ull;
const int M = 1e5 + 10;
char s[M];
ull h[M], h1[M], po[M];
int p = 131;
ull g1(int l, int r)
{
return h[r] - h[l - 1] * po[r - l + 1];
}
ull g2(int l, int r)
{
return h1[r] - h1[l - 1] * po[r - l + 1];
}
int main() {
while(scanf("%s", s + 1)!=EOF)
{
int l = strlen(s + 1);
po[0] =1;
h[0] = 0;
for (int i = 1; i <= M; i++)
po[i] = po[i - 1] * p;
for (int i = 1; i <= l; i++)
{
h[i] = h[i - 1] * p + s[i];
h1[i] = h1[i - 1] * p + s[l - i + 1];
}
int mi = 0;
for (int i = 1; i <= l; i++)
{
ull pre = g1(i, l);
ull suf = g2(1, l - i + 1);
if (pre == suf)
{
mi = i - 1;
break;
}
}
printf("%s", s + 1);
for (int i = mi; i >= 1; i--)
printf("%c", s[i]);
printf("\n");
}
return 0;
}