UVA-257

题意:

给你很多串,你需要找到这个串内有没有两个长度大于3的回文字符串,且要保证这两个回文字符串不相同,也不能完全覆盖,但可以重合一部分

题解:

首先判断回文的话可以通过马拉车算法(Manacher算法),如果在某个位置上回文长度大于3的话就要判断一下,如果串长为奇数,那么就取3,否则取4。

为什么呢?为了防止会完全覆盖

如果在i位置上面串长为奇数,那么我们只会取3,例如bab。此时你应该在下一个位置(即,i+1)去判断,而不能还在i位置找回文串(因为这个会和之前的有覆盖关系)

如果i+1位置回文串长度为奇数,例如babab(前面的bab是第i个位置的回文串),因为是奇数,我们只取3,所以只会取中间的3个,那么就不会和之前的有覆盖关系(其他情况你也可以自己去分析一下)

到这里还没有完,我们避免了完全覆盖,但是还要注意两个不同位置的回文串可能会相同,所以可以用哈希+map来判重

代码:

#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<string.h>
#include<sstream>
#include<map>
using namespace std;
typedef unsigned long long ull;
const int maxn=110010;
char s[maxn],str[maxn*2];
map<ull,int> mp;
int Len[maxn*2],num;
ull hash_[maxn],xp[maxn];
void init_()
{
xp[0]=1;
for(int i=1;i<maxn;i++)
xp[i]=xp[i-1]*13331;
return ;
}
void init(int len) //这个是用来处理字符串的
{
memset(str,0,sizeof(str));
int k=0;
str[k++]='$';
for(int i=0;i<len;++i)
str[k++]='#',str[k++]=s[i];
str[k++]='#';
num=k;
}
void manacher(int len) //求最长回文子串
{
Len[0]=0;
int sum=0;
int id,mx=0;
for(int i=1;i<len;++i)
{
if(i<mx) Len[i]=min(mx-i,Len[2*id-i]);
else Len[i]=1;
while(str[i-Len[i]]==str[i+Len[i]]) Len[i]++;
if(Len[i]+i>mx)
{
mx=Len[i]+i;
id=i;
sum=max(sum,Len[i]);
}
}
//return (sum-1);
}
void make_hash(char str[])
{
int len=strlen(str);
hash_[len]=0;
for(int i=len-1;i>=0;i--)
{
hash_[i]=hash_[i+1]*13331+str[i]-'A'+1;
}
return ;
}
ull Get_hash(int i,int L)
{
return hash_[i]-hash_[i+L]*xp[L];
}
int main()
{
int ans=0;
init_();
while(scanf("%s",s)!=EOF)
{ mp.clear();
int len=strlen(s);
init(len);
make_hash(s);
manacher(num);//manacher之后,Mp[i]-1为i位置的回文半径
int cnt=0;
for(int i=0;i<2*len+2;i++)
{
if(Len[i]-1>=3)
{
if(Len[i]%2==1)//回文串为偶数,取长度四的回文串
{
int st=(i-1)/2-2;
int le=4;
ull tmp=Get_hash(st,le);
mp[tmp]++;
}
else//回文串为奇数,取长度三的回文串
{
int st=i/2-2;
int le=3;
ull tmp=Get_hash(st,le);
mp[tmp]++;
}
i++;//当前位置存在大于三的回文串,避免覆盖后移一位。
}
}
if(mp.size()>=2) printf("%s\n",s);
}
return 0;
}

UVA-257 哈希算法的更多相关文章

  1. java单向加密算法小结(2)--MD5哈希算法

    上一篇文章整理了Base64算法的相关知识,严格来说,Base64只能算是一种编码方式而非加密算法,这一篇要说的MD5,其实也不算是加密算法,而是一种哈希算法,即将目标文本转化为固定长度,不可逆的字符 ...

  2. [基础技能] 安全技术——哈希算法密码破解之彩虹表(Rainbow Table)学习

    1.基础知识 刚刚学习过数字签名的相关知识,以及数字签名的伪造技术,而伪造数字签名归根结底就是密码破解的一个过程,然而直接破解的速度是非常缓慢的,所以有人想出一种办法,直接建立出一个数据文件,里面事先 ...

  3. .NET平台开源项目速览(12)哈希算法集合类库HashLib

    .NET的System.Security.Cryptography命名空间本身是提供加密服务,散列函数,对称与非对称加密算法等功能.实际上,大部分情况下已经满足了需求,而且.NET实现的都是目前国际上 ...

  4. 一致性哈希算法与Java实现

    原文:http://blog.csdn.net/wuhuan_wp/article/details/7010071 一致性哈希算法是分布式系统中常用的算法.比如,一个分布式的存储系统,要将数据存储到具 ...

  5. 五分钟理解一致性哈希算法(consistent hashing)

    转载请说明出处:http://blog.csdn.net/cywosp/article/details/23397179 一致性哈希算法在1997年由麻省理工学院提出的一种分布式哈希(DHT)实现算法 ...

  6. 每天进步一点点——五分钟理解一致性哈希算法(consistent hashing)

    转载请说明出处:http://blog.csdn.net/cywosp/article/details/23397179     一致性哈希算法在1997年由麻省理工学院提出的一种分布式哈希(DHT) ...

  7. C# MD5摘要算法、哈希算法

    MD5即Message-Digest Algorithm 5(信息-摘要算法5),用于确保信息传输完整一致.是计算机广泛使用的杂凑算法之一(又译摘要算法.哈希算法) MD5算法具有以下特点: 1.压缩 ...

  8. FNV哈希算法

    由来:FNV哈希算法全名为Fowler-Noll-Vo算法,是以三位发明人Glenn Fowler,Landon Curt Noll,Phong Vo的名字来命名的,最早在1991年提出. 特点和用途 ...

  9. 一致性哈希算法以及其PHP实现

    在做服务器负载均衡时候可供选择的负载均衡的算法有很多,包括:  轮循算法(Round Robin).哈希算法(HASH).最少连接算法(Least Connection).响应速度算法(Respons ...

  10. Java_一致性哈希算法与Java实现

    摘自:http://blog.csdn.net/wuhuan_wp/article/details/7010071 一致性哈希算法是分布式系统中常用的算法.比如,一个分布式的存储系统,要将数据存储到具 ...

随机推荐

  1. 使用Jenkins+Pipline 持构建自动化部署之安卓源码打包、测试、邮件通知

    一.引言 Jenkins 2.x的精髓是Pipeline as Code,那为什么要用Pipeline呢?jenkins1.0也能实现自动化构建,但Pipeline能够将以前project中的配置信息 ...

  2. 【葵花宝典】一天掌握Kubernetes

    1.kubernetes介绍 kubernetes,简称K8s,是用8代替8个字符"ubernete"而成的缩写.是一个开源的,用于管理云平台中多个主机上的容器化的应用,Kuber ...

  3. mysql5.5 升级至5.7

    mysql5.5 升级至5.7 1.下载mysql5.7.32 官方下载地址 解压 tar xvf mysql.tar.gz mysql/ 2. 进入旧的mysql的bin目录下导出mysql的数据 ...

  4. Docker相关简介以及使用方法

    Docker: 可以把它看作是一个软件,在这个软件当中呢,还可以安装其他的软件,还可以把软件所需要的环境依赖一起添加进来,这样让开发人员的程序在不同的环境当中都可以流转起来,避免了程序出现" ...

  5. drf认证、节流、权限、版本

    Django rest framework 认证: 作用:验证用户是否登录 在视图类中写上authentication_classes = [ ],这是一个列表 需要实现 authenticate() ...

  6. NFS存储迁移至GlusterFS

    NFS存储迁移至GlusterFS 前提条件 为防止脑裂,建议使用最低3台节点制作3复制集的存储卷: 在进行存储迁移前,GluseterFS存储节点需先成为k8s集群中的node节点: 存储切换时请勿 ...

  7. 在Golang中如何正确地使用database/sql包访问数据库

    本文记录了我在实际工作中关于数据库操作上一些小经验,也是新手入门golang时我认为一定会碰到问题,没有什么高大上的东西,所以希望能抛砖引玉,也算是对这个问题的一次总结. 其实我也是一个新手,机缘巧合 ...

  8. 解决键冲突 — Redis 设计与实现 https://redisbook.com/preview/dict/collision_resolution.html

    解决键冲突 - Redis 设计与实现 https://redisbook.com/preview/dict/collision_resolution.html

  9. A1Z26 Cipher - Letter Number A=1 B=2 C=3 - Online Decoder, Translator https://www.dcode.fr/letter-number-cipher

    A1Z26 Cipher - Letter Number A=1 B=2 C=3 - Online Decoder, Translator https://www.dcode.fr/letter-nu ...

  10. Spring 设计模式介绍

    JDK 中用到了那些设计模式?Spring 中用到了那些设计模式?这两个问题,在面试中比较常见.我在网上搜索了一下关于 Spring 中设计模式的讲解几乎都是千篇一律,而且大部分都年代久远.所以,花了 ...