题意:

思路:

在实现时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)的更多相关文章

  1. [UOJ#219][BZOJ4650][Noi2016]优秀的拆分

    [UOJ#219][BZOJ4650][Noi2016]优秀的拆分 试题描述 如果一个字符串可以被拆分为 AABBAABB 的形式,其中 A 和 B 是任意非空字符串,则我们称该字符串的这种拆分是优秀 ...

  2. 洛谷P1117 优秀的拆分【Hash】【字符串】【二分】【好难不会】

    题目描述 如果一个字符串可以被拆分为AABBAABB的形式,其中 A和 B是任意非空字符串,则我们称该字符串的这种拆分是优秀的. 例如,对于字符串aabaabaaaabaabaa,如果令 A=aabA ...

  3. UOJ219 NOI2016 优秀的拆分 二分、字符串哈希

    传送门 题目可以转化为求\(AA\)的数量,设\(cnt1_x\)表示左端点为\(x\)的\(AA\)的数量,\(cnt2_x\)表示右端点为\(x\)的\(AA\)的数量,那么答案就是\(\sum ...

  4. BZOJ4650 [NOI2016]优秀的拆分 【后缀数组】

    题目 如果一个字符串可以被拆分为 AABBAABB 的形式,其中 AA 和 BB 是任意非空字符串,则我们称该字符串的这种拆 分是优秀的.例如,对于字符串 aabaabaa,如果令 A=aabA=aa ...

  5. BZOJ4650: [Noi2016]优秀的拆分(hash 调和级数)

    题意 题目链接 Sol NOI的题都这么良心么.. 先交个\(n^4\)暴力 => 75 hash优化一下 => 90 然后\(90\)到\(100\)分之间至少差了\(10\)难度台阶= ...

  6. bzoj4650: [Noi2016]优秀的拆分 hash

    好气啊,没开longlong又biubiu了 底层: 用hash或者奇奇怪怪的算法兹磁logn求最长公共前后缀 思路: 统计出从一个点开始和结束的形如AA的子串的个数 统计的时候把相邻的结果相乘加起来 ...

  7. UOJ#219/BZOJ4650 [NOI2016]优秀的拆分 字符串 SA ST表

    原文链接http://www.cnblogs.com/zhouzhendong/p/9025092.html 题目传送门 - UOJ#219 (推荐,题面清晰) 题目传送门 - BZOJ4650 题意 ...

  8. BZOJ4650: [Noi2016]优秀的拆分

    考场上没秒的话多拿5分并不划算的样子. 思想其实很简单嘛. 要统计答案,求以每个位置开始和结束的AA串数量就好了.那么枚举AA中A的长度L,每L个字符设一个关键点,这样AA一定经过相邻的两个关键点.计 ...

  9. BZOJ4650 NOI2016优秀的拆分(后缀数组)

    显然只要求出以每个位置开始的AA串数量就可以了,将其和反串同位置的结果乘一下,加起来就是答案.考虑对每种长度的字符串计数.若当前考虑的A串长度为x,我们每隔x个字符设一个关键点,求出相邻两关键点的后缀 ...

  10. [BZOJ4650][NOI2016]优秀的拆分(SAM构建SA)

    关于解法这个讲的很清楚了,主要用了设关键点的巧妙思想. 主要想说的是一个刚学的方法:通过后缀自动机建立后缀树,再转成后缀数组. 后缀数组功能强大,但是最令人头疼的地方是模板太难背容易写错.用这个方法, ...

随机推荐

  1. React实战之60s倒计时按钮(发送短信验证按钮)

    React实战之60s倒计时按钮——短信验证按钮 导入:(antd组件——Form表单) import { Button, Form, Input } from 'antd'; const FormI ...

  2. Chrome教程之NetWork面板分析网络请求

    官方文档:https://developers.google.com/web/tools/chrome-devtools/network/ 最近打算写一写Chrome教程文档,不知道大家最感兴趣的是什 ...

  3. HTML 5语义元素

  4. map Codeforces Round #Pi (Div. 2) C. Geometric Progression

    题目传送门 /* 题意:问选出3个数成等比数列有多少种选法 map:c1记录是第二个数或第三个数的选法,c2表示所有数字出现的次数.别人的代码很短,思维巧妙 */ /***************** ...

  5. Ajax动态加载数据

    前言: 1.这个随笔实现了一个Ajax动态加载的例子. 2.使用.net 的MVC框架实现. 3.这个例子重点在前后台交互,其它略写. 开始: 1.控制器ActionResult代码(用于显示页面) ...

  6. 设计模式("大话设计模式"读书笔记 C#实现)

    前言:毫无疑问 ,学习一些设计模式,对我们的编程水平的提高帮助很大.写这个博客的时候自己刚开始学习设计模式,难免有错,欢迎评论指正. 我学设计模式的第一本书是“大话设计模式”. 1.为什么要学设计模式 ...

  7. Android Programming 3D Graphics with OpenGL ES (Including Nehe's Port)

    https://www3.ntu.edu.sg/home/ehchua/programming/android/Android_3D.html

  8. delphi 字符串处理中的怪异现象与处理

    1, 怪异现象:字符串相加操作不正常! 以上代码,明显输出字符串应含有后缀“.jpg”,但实际输出却不含后缀(如下),字符串加法操作似乎不起作用了! 采用showMessage进行输出,看看结果如何? ...

  9. Linux 学习(二)

    Linux相关命令 命令 说明 startx 当前用户界面切换至图形界面 init5 切换至另一用户的图形化界面 init3 从图形界面切换回文本界面 pwd 显示当前用户路径 logout 注销 s ...

  10. key-value键值型数据库:Redis

    key-value键值型数据库:Redis redis Redis是in-memory型(内存型)的键值数据库,数据在磁盘上是持久的,键类型是字符串,值类型是字符串.字符串集合(Set).sorted ...