【BZOJ4650&UOJ219】优秀的拆分(二分,hash)
题意:
思路:
在实现时SA可以用hash+二分代替,会多一个log
BZ上跑的飞快,但UOJ上extra卡出翔,已经放弃
不过转C或者写SA没准就过了
看来转C迫在眉睫
const mo=;
var f,g:array[..]of int64;
h,mi:array[..]of int64;
v,cas,i,n,j,x,y:longint;
ans:int64;
ch:ansistring; function min(x,y:longint):longint;
begin
if x<y then exit(x);
exit(y);
end; function hash(x,y:longint):longint;
begin
hash:=(h[y]-h[x-]*mi[y-x+] mod mo+mo) mod mo;
end; function lcp(x,y:longint):longint;
var l,r,mid,last:longint;
begin
l:=; r:=min(i,min(n-x+,n-y+)); last:=;
while l<=r do
begin
mid:=(l+r)>>;
if hash(x,x+mid-)=hash(y,y+mid-) then begin last:=mid; l:=mid+; end
else r:=mid-;
end;
exit(last);
end; function lcs(x,y:longint):longint;
var l,r,mid,last:longint;
begin
l:=; r:=min(i,min(x,y)); last:=;
while l<=r do
begin
mid:=(l+r)>>;
if hash(x-mid+,x)=hash(y-mid+,y) then begin last:=mid; l:=mid+; end
else r:=mid-;
end;
exit(last);
end; begin mi[]:=;
for i:= to do mi[i]:=mi[i-]* mod mo;
readln(cas);
for v:= to cas do
begin
readln(ch);
n:=length(ch);
for i:= to n+ do
begin
f[i]:=; g[i]:=; h[i]:=;
end;
for i:= to n do h[i]:=(h[i-]*+ord(ch[i])-ord('a')+) mod mo;
for i:= to (n+) div do
begin
j:=;
while j<=n do
begin
if j+i>n then break;
if (ch[j]<>ch[j+i]) then begin j:=j+i; continue; end;
x:=lcp(j,j+i); y:=lcs(j,j+i);
// x:=min(x,i); y:=min(y,i);
if x+y>i then
begin
inc(g[j-y+]); dec(g[j+x-i+]);
inc(f[j+i-y+i]); dec(f[j+i+x]);
end;
j:=j+i;
end;
end;
ans:=;
for i:= to n do f[i]:=f[i-]+f[i];
for i:= to n do g[i]:=g[i-]+g[i];
for i:= to n- do ans:=ans+f[i]*g[i+];
writeln(ans);
end; end.
【BZOJ4650&UOJ219】优秀的拆分(二分,hash)的更多相关文章
- [UOJ#219][BZOJ4650][Noi2016]优秀的拆分
[UOJ#219][BZOJ4650][Noi2016]优秀的拆分 试题描述 如果一个字符串可以被拆分为 AABBAABB 的形式,其中 A 和 B 是任意非空字符串,则我们称该字符串的这种拆分是优秀 ...
- 洛谷P1117 优秀的拆分【Hash】【字符串】【二分】【好难不会】
题目描述 如果一个字符串可以被拆分为AABBAABB的形式,其中 A和 B是任意非空字符串,则我们称该字符串的这种拆分是优秀的. 例如,对于字符串aabaabaaaabaabaa,如果令 A=aabA ...
- UOJ219 NOI2016 优秀的拆分 二分、字符串哈希
传送门 题目可以转化为求\(AA\)的数量,设\(cnt1_x\)表示左端点为\(x\)的\(AA\)的数量,\(cnt2_x\)表示右端点为\(x\)的\(AA\)的数量,那么答案就是\(\sum ...
- BZOJ4650 [NOI2016]优秀的拆分 【后缀数组】
题目 如果一个字符串可以被拆分为 AABBAABB 的形式,其中 AA 和 BB 是任意非空字符串,则我们称该字符串的这种拆 分是优秀的.例如,对于字符串 aabaabaa,如果令 A=aabA=aa ...
- BZOJ4650: [Noi2016]优秀的拆分(hash 调和级数)
题意 题目链接 Sol NOI的题都这么良心么.. 先交个\(n^4\)暴力 => 75 hash优化一下 => 90 然后\(90\)到\(100\)分之间至少差了\(10\)难度台阶= ...
- bzoj4650: [Noi2016]优秀的拆分 hash
好气啊,没开longlong又biubiu了 底层: 用hash或者奇奇怪怪的算法兹磁logn求最长公共前后缀 思路: 统计出从一个点开始和结束的形如AA的子串的个数 统计的时候把相邻的结果相乘加起来 ...
- UOJ#219/BZOJ4650 [NOI2016]优秀的拆分 字符串 SA ST表
原文链接http://www.cnblogs.com/zhouzhendong/p/9025092.html 题目传送门 - UOJ#219 (推荐,题面清晰) 题目传送门 - BZOJ4650 题意 ...
- BZOJ4650: [Noi2016]优秀的拆分
考场上没秒的话多拿5分并不划算的样子. 思想其实很简单嘛. 要统计答案,求以每个位置开始和结束的AA串数量就好了.那么枚举AA中A的长度L,每L个字符设一个关键点,这样AA一定经过相邻的两个关键点.计 ...
- BZOJ4650 NOI2016优秀的拆分(后缀数组)
显然只要求出以每个位置开始的AA串数量就可以了,将其和反串同位置的结果乘一下,加起来就是答案.考虑对每种长度的字符串计数.若当前考虑的A串长度为x,我们每隔x个字符设一个关键点,求出相邻两关键点的后缀 ...
- [BZOJ4650][NOI2016]优秀的拆分(SAM构建SA)
关于解法这个讲的很清楚了,主要用了设关键点的巧妙思想. 主要想说的是一个刚学的方法:通过后缀自动机建立后缀树,再转成后缀数组. 后缀数组功能强大,但是最令人头疼的地方是模板太难背容易写错.用这个方法, ...
随机推荐
- spring cloud config搭建说明例子(二)-添加eureka
添加注册eureka 服务端 ConfigServer pom.xml <dependency> <groupId>org.springframework.cloud</ ...
- Java多线程(九) synchronized 锁对象的改变
public class MyService { private String lock = "123"; public void testMethod() { synchroni ...
- markdown 常用语法总结 - 个人版
这里并不是要总结所有的 markdown 语法,只是总结笔者自己撰写博客时常用的一些 markdown 语法. 1 图片设置 1.1 设置图片位置 利用markdown在编写文档时插入图片是默认靠左, ...
- spring简介及常用术语
1.引入 在开发应用时常会遇到如下问题: 1)代码耦合性高: 2)对象之间依赖关系处理繁琐: 3)事务控制繁琐: 2.Spring简介 1)Spring概述 什么是Spring: ①Spring是一个 ...
- mysql之replace into与 insert into duplicat key for update
mysql实际应用中,我们在插入数据的时候,经常遇到主键冲突的情况,这是因为库中已经存在相同主键的数据,这时,我们只能更新数据:在判断是更新数据还是插入数据,我们还需要在此之前做一些必要的判断:在my ...
- Spring-Aop的两种代理方式
Spring-Aop两种代理方式: 1.JDK动态代理:用于目标类实现了接口: 2.Cglib动态代理:用于目标类没有实现接口: spring会依据目标类是否实现接口来选择使用哪种代理方式(目标类:相 ...
- Android ListView动态刷新某项Item
使用ViewHolder来刷新某项数据,而不用每次都全部刷新数据. 继承BaseAdapter,新建ViewHolder类. public class TestListAdapter extends ...
- postgreSQL在Centos6下编译安装
1.准备安装源 下载地址:https://www.postgresql.org/ftp/source/ 下载并解压. 2.软件编译安装 配置.检查安装环境 ./configure --prefix=/ ...
- Angular——$http
基本介绍 $http用于向服务端发起异步请求,同时还支持多种快捷方式如$http.get().$http.post().$http.jsonp.$hhtp也是属于内置服务的一种,这里特意提出来写一篇用 ...
- Angular——依赖注入
基本介绍 1.AngularJS采用模块化的方式组织代码,将一些通用逻辑封装成一个对象或函数,实现最大程度的复用,这导致了使用者和被使用者之间存在依赖关系. 2.所谓依赖注入是指在运行时自动查找依赖关 ...