UVA
来源:互联网 发布:mac win7升级win10 编辑:程序博客网 时间:2024/05/21 17:29
题意:
题目链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=2470
给出一个字符串,在末尾补充最少的字母,使其整个成为一个回文串。
思路:
字符串哈希的巧妙运用,很显然如果是回文串,那么正着哈希和倒着哈希得到的值是一样的。
而通过哈希的数值来进行拼接组合可以节省大量时间。只要枚举位置x,
将[1,x]这段哈希值与求出的总的哈希值拼接,比较正哈希值与倒哈希值是否相同即可
ps:131进制是个好东西。
代码:
#include <bits/stdc++.h>using namespace std;typedef unsigned long long ULL;const int MAXN = 1e5 + 10;const ULL seed = 131;char s[MAXN];ULL f[MAXN];int main() { //freopen("in.txt", "r", stdin); f[0] = 1; for (int i = 1; i < MAXN; i++) f[i] = f[i - 1] * seed; while (scanf("%s", s) != EOF) { int n = strlen(s); ULL sum1 = 0, sum2 = 0; for (int i = 0; i < n; i++) { sum1 = sum1 * seed + s[i] - 'A'; sum2 = sum2 + (s[i] - 'A') * f[i]; } if (sum1 == sum2) { puts(s); continue; } ULL add1 = 0, add2 = 0; int pos = -1; for (int i = 0; i < n; i++) { add1 = add1 + (s[i] - 'A') * f[i]; add2 = add2 * seed + s[i] - 'A'; ULL tmp1 = sum1 * f[i + 1] + add1; ULL tmp2 = sum2 + add2 * f[n]; if (tmp1 == tmp2) { pos = i; break; } } printf("%s", s); for (int i = pos; i >= 0; i--) printf("%c", s[i]); puts(""); } return 0;}
0 0
- uva
- UVA
- UVA
- UVA
- uva
- UVA
- UVA
- UVA
- UVA
- UVA
- UVA
- UVA
- UVA
- UVA
- UVA
- UVA
- UVA
- UVA
- ViewPage+Fragment实现切换动画
- UVA 1368
- 【C语言】判断三角形形状
- java的异常处理(一)
- 如何正确的重写equals() 和 hashCode()方法
- UVA
- spring配置文件ApplicationContext.xml文件里面代码没有提示功能
- POJ 1195 Mobile phones
- Python selenium
- 关于在window系统下安装oracle virtualbox 出现创建对象失败
- 【第8讲】铁氧体磁芯
- Android开发环境(Windows)Eclipse+ADT中sdk目录结构介绍
- 【学习笔记】mysql中的数据类型(二)
- Git