UVA11475

来源:互联网 发布:数控车床初级编程视频 编辑:程序博客网 时间:2024/06/06 02:09

1.题目描述:

题目描述PDF

2.题意概述:

给你一个字符串,让你在结尾添加最少的字符使其成为回文字符串。

3.解题思路:

当时没学kmp,学长开的是哈希专题,考虑hash:先按倒序求出各子串的哈希值,然后再正着算子串的哈希值,直到找到哈希值相同的,找到最长的回文串。。。

例如abcdc,先依次求出c,cdc,cdcb,cdcba的哈希值。。然后求abcdc的哈希值。。再去掉a,求出bcdc的哈希值,再求出cdc的哈希值。。然后这时候刚刚算过的哈希值里有这个诶。然后就是处理输出就好了。

4.AC代码:

#include <bits/stdc++.h>#define INF 0x7fffffff#define maxn 100100#define eps 1e-6#define pi acos(-1.0)#define e 2.718281828459#define mod (int)1e9 + 7#define hashmod 2233using namespace std;typedef long long ll;int main(){#ifndef ONLINE_JUDGE  freopen("in.txt", "r", stdin);  freopen("out.txt", "w", stdout);  long _begin_time = clock();#endif  string str;  while (cin >> str)  {    int len = str.length();    int pre = 0, cur = 0, pos = 1, ans = len;    for (int i = len - 1; i >= 0; i--)    {      pre = pre + pos * (str[i] - 'a');      cur = cur * hashmod + str[i] - 'a';      pos *= hashmod;      if (pre == cur)        ans = i;    }    cout << str;    for (int i = ans - 1; i >= 0; i--)      cout << str[i];    puts("");  }#ifndef ONLINE_JUDGE  long _end_time = clock();  printf("time = %ld ms\n", _end_time - _begin_time);#endif  return 0;}

原创粉丝点击