Hash(LCP) || 后缀数组 LA 4513 Stammering Aliens

 

题目传送门

题意:训练指南P225

分析:二分寻找长度,用hash值来比较长度为L的字串是否相等。

#include <bits/stdc++.h>
using namespace std;typedef unsigned long long ull;
const int N = 4e4 + 5;
const int x = 123;
ull H[N], _hash[N], xp[N];
int rk[N];
char str[N];
int m;void get_hash(char *s, int len)  {H[len] = 0;for (int i=len-1; i>=0; --i) {H[i] = H[i+1] * x + (s[i] - 'a');}xp[0] = 1;for (int i=1; i<len; ++i) {xp[i] = xp[i-1] * x;}
}bool cmp(const int &a, const int &b) {return (_hash[a] < _hash[b] || (_hash[a] == _hash[b] && a < b));
}int check(int L, int len)    {int cnt = 0, pos = -1, c = 0;for (int i=0; i<len-L+1; ++i)   {rk[i] = i;_hash[i] = H[i] - H[i+L] * xp[L];}sort (rk, rk+len-L+1, cmp);for (int i=0; i<len-L+1; ++i)   {if (i == 0 || _hash[rk[i]] != _hash[rk[i-1]])   c = 0;if (++c >= m)   pos = max (pos, rk[i]);}return pos;
}int main(void)  {while (scanf ("%d", &m) == 1)   {if (!m) break;scanf ("%s", &str);int len = strlen (str);get_hash (str, len);if (check (1, len) == -1) puts ("none");else    {int l = 1, r = len + 1;while (r - l > 1)   {int mid = l + r >> 1;if (check (mid, len) >= 0)    l = mid;else    r = mid;}printf ("%d %d\n", l, check (l, len));}}return 0;
}

 

后缀数组也可以求解,具体就是二分答案,height数组分组判断是否满足存在题意的解,并使最优。(m=1时特判处理)

#include <bits/stdc++.h>const int N = 4e4 + 5;
int sa[N], rank[N], height[N];
int ws[N], wa[N], wb[N];
char s[N];bool cmp(int *r, int a, int b, int l) {return (r[a] == r[b] && r[a+l] == r[b+l]);
}
void DA(char *r, int n, int m = 128) {int i, j, p, *x = wa, *y = wb;for (i=0; i<m; ++i) ws[i] = 0;for (i=0; i<n; ++i) ws[x[i]=r[i]]++;for (i=1; i<m; ++i) ws[i] += ws[i-1];for (i=n-1; i>=0; --i) sa[--ws[x[i]]] = i;for (j=1, p=1; p<n; j<<=1, m=p) {for (p=0, i=n-j; i<n; ++i) y[p++] = i;for (i=0; i<n; ++i) if (sa[i] >= j) y[p++] = sa[i] - j;for (i=0; i<m; ++i) ws[i] = 0;for (i=0; i<n; ++i) ws[x[y[i]]]++;for (i=1; i<m; ++i) ws[i] += ws[i-1];for (i=n-1; i>=0; --i) sa[--ws[x[y[i]]]] = y[i];std::swap (x, y);for (p=1, x[sa[0]]=0, i=1; i<n; ++i) {x[sa[i]] = cmp (y, sa[i-1], sa[i], j) ? p - 1 : p++;}}
}
void calc_height(char *r, int *sa, int n) {int i, j, k = 0;for (i=1; i<=n; ++i) rank[sa[i]] = i;for (i=0; i<n; ++i) {if (k) k--;j = sa[rank[i]-1];while (r[i+k] == r[j+k]) k++;height[rank[i]] = k;}
}int m;
int check(int len, int n) {int p = -1;int cnt = 0, ret = -1;for (int i=1; i<=n; ++i) {if (height[i] >= len) {if (p == -1) {p = std::max (sa[i-1], sa[i]);} else {p = std::max (p, std::max (sa[i-1], sa[i]));}cnt++;if (cnt + 1 >= m) {ret = std::max (ret, p);}} else {p = -1;cnt = 0;}}return ret;
}int main() {while (scanf ("%d", &m) == 1) {if (!m) break;scanf ("%s", s);int n = strlen (s);if (m == 1) {printf ("%d %d\n", n, 0);continue;}DA (s, n + 1);calc_height (s, sa, n);int best = 0, pos = -1;int left = 0, right = n;while (left <= right) {int mid = left + right >> 1;int res = check (mid, n);if (res != -1) {if (best < mid) {best = mid;pos = res;} else if (mid > 0 && best == mid && pos < res) {pos = res;}left = mid + 1;} else {right = mid - 1;}}if (pos == -1) {puts ("none");} else {printf ("%d %d\n", best, pos);}}return 0;
}

  

转载于:https://www.cnblogs.com/Running-Time/p/5123779.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/262186.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2009小记

也许这个总结早就应该写了&#xff0c;不过按照学生的时间表&#xff0c;现在写也还说的过去&#xff0c;呵呵 到现在转到计算机这个专业好像已经好几年了&#xff0c;学了很多很多的东西&#xff0c;不过老觉得还是浮在表面上&#xff0c;没有真正的进入深层次的学习。也许我并…

python画菱形的代码_Python打印“菱形”星号代码方法

本人是一名python初学者&#xff0c;刚刚看到一道有趣的python问题&#xff0c;“用python如何在编译器中打印出菱形图案&#xff1f;” 因此决定尝试一下&#xff0c;代码不多&#xff0c;仅供参考。 代码 def printStar(intNum): s "*" spaceLength intNum block…

python创建变量score_使用Python 3.5.1中的变量创建文件时的FileNotFoundError

我正在尝试使用Python中的变量创建一个文件&#xff0c;但它不会拥有它。 以下是创建文件名的代码&#xff1a;a, b time.strftime("%d/%m/%Y"), time.strftime("%H-%M-%S")c ("SCORE""-""("a")""-"&…

Ubuntu 14.04.3 LTS 配置 DNS Server

我们目的是用一台局域网机器完成 192.168.1.113 <-->cloudshield.com的解析&#xff0c;指定A记录和CNAME; 0.关于Ubuntu 14.04.2 LTS 下载、安装、更新这里就直接跳过了; 1.下载安装工具 bind9 sudo apt-get install bind9 DNS 配置文件在/etc/bind 目录中。安装bind9后…

汇编的艺术(01)sizeof operator

以前在百度的博客里面学习了逆向一些基本的C语言知识。一方面不能让学习的汇编知识荒废&#xff0c;另外一方面是由于经常碰到一些细节性的问题&#xff0c;需要温故而知新。 学习汇编对于我自己的感觉是&#xff1a;可以从更加底层的角度来窥视C语言以及其他高层语言的细节。这…

堆和栈地址——eclipse linux实践

chara[]"as";栈&#xff0c;或全局常量char*a2"das";字符常量 string*snewstring("da");堆 printf("%p %p %p %p",a,a2,s,&"as"字符常量); 0xbfa9b994栈或0x8049d88全局常量 0x8048a50字符常量 0x85ea008堆 0x8048a57字…

java single instance_java单例模式(具体代码显现)两种方法

判断是否存在/*** 懒汉式*/public class LazySingleInstance {// 私有构造方法private LazySingleInstance(){};// 私有的类对象private static LazySingleInstance instance null;// 缺点&#xff1a;// 1 每次都需要去判断instance 是否为空// 2 调用时才去new对象&#xff…

python界面编程和网口通信_Python—网络通信编程之tcp通信编程

服务端代码 import socket # 1.创建流式套接字实例 # server socket.socket() server socket.socket(socket.AF_INET, socket.SOCK_STREAM, 0) # 2.使用bind方法绑定端口号。服务端绑定的ip和port&#xff08;参数是元组&#xff09; server.bind(("127.0.0.1", 88…

判断是否是控制字符

#include <stdio.h> #include <ctype.h>/* 判断是控制字符&#xff08;ASCII 0-31和127&#xff09;的库函数&#xff1a; 满足指定的条件&#xff0c;返回非0&#xff1b;否则返回0. iscntrl(c) *//**************** 输入&#xff1a;要判断的字符。* 输出&#x…

感冒了

1 浑身发冷 2 大腿酸痛&#xff0c;无力 3 口腔溃疡。在舌头尖上有一个小白点&#xff0c;周围有点红色。 4 有点咳嗽。 5 有浓痰。 转载于:https://www.cnblogs.com/sdgxbooy/archive/2010/01/27/8902970.html

php代码加注释_怎么在php中添加注释

注释在写代码的过程中非常重要&#xff0c;好的注释能让你的代码读起来更轻松&#xff0c;在写代码的时候一定要注意注释的规范。php里面常见的几种注释方式&#xff1a;1.文件头的注释&#xff0c;介绍文件名&#xff0c;功能以及作者版本号等信息/***文件名简单介绍**文件功能…

数据库整理

转载于:https://www.cnblogs.com/cuikang/p/5131531.html

python保存模型_MNIST数据集训练完如何保存成模型文件?

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 import tensorflow as tf from tensorflow.examples.tutorials.mnist import input_data # In[12]: #载入数据集 mnist input_data.read_data_sets("E://YangBen//MNIST_data",one_hotTrue) #每个批次的大小 batch_siz…

GridControl动态添加 颜色列

设计器&#xff1a; 核心代码&#xff1a; DataTable dt new DataTable("UniqueValue");dt.Columns.Add("symbol", typeof(Color));dt.Columns.Add("label",typeof(string));dt.Columns.Add("count",typeof(int));for (int i 0; i &…

代码托管使用指南

2019独角兽企业重金招聘Python工程师标准>>> 开源中国 登录https://git.oschina.net/ 点击 “” 增加新的项目出现创建项目界面&#xff0c;按照提示&#xff0c;输入相应内容点击“管理”显示如下界面 启用svn&#xff0c;输入你所设置的地址。 svn://git.oschin…

python3.6.5怎么下载_windows下如何下载并安装Python 3.6.4 ?

点击Download中的Windows&#xff0c;如下图所示&#xff1a; 2、下载exe后缀的可执行文件&#xff0c;根据自己系统选择32位还是64位。 3、32位和64位的版本安装起来没有区别&#xff0c;双击打开后&#xff0c;第一步要记得勾上Add python to Path 选项&#xff0c;意思是把P…

php中接口验证失败,php短信验证失败的原因

随着国民经济的高速发展&#xff0c;短信的应用也逐渐商业化&#xff0c;很多企业、商家开始使用php短信接口来进行推广、营销或内部管理&#xff0c;只是个别的商家在应用php短信接口的时候却遇到了短信发送失败的现象&#xff0c;这到底是因为商家操作有误&#xff0c;还是因…

数据库无法保存中文的解决

1. ALTER DATABASE dbname COLLATE CHINESE_PRC_CS_AI 2. 使用nvarchar, ntext.转载于:https://www.cnblogs.com/cnblogsfans/archive/2010/01/29/1659264.html

1 用存储过程实现分页,除了上一页,下一页,第一页,和末页外还要有go按钮,以及go到那里的文本框。另外还要在Lable显示“当前x页,一共y页”。注意验证控件的使用和 链接存储过程的内容。...

前台部分 <% Page Xlanguage"C#" AutoEventWireup"true" CodeBehind"USEsp_page.aspx.cs" Inherits"12_7" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml…

CentOS6.3中挂载NTFS移动硬盘的经历

2019独角兽企业重金招聘Python工程师标准>>> 鄙人当年用PC硬盘做了一个移动硬盘&#xff08;其实并不方便移动&#xff0c;只是外边包装了一个壳子&#xff0c;可以用USB口访问而已&#xff09;&#xff0c;移动硬盘上存放了一些学习资料。某日想把一部分学习资料拿…