好气啊,没开longlong又biubiu了

底层:

用hash或者奇奇怪怪的算法兹磁logn求最长公共前后缀

思路:

统计出从一个点开始和结束的形如AA的子串的个数

统计的时候把相邻的结果相乘加起来就好了

 #include <bits/stdc++.h>
#define MOD 998244353
#define ad(x,y,z) t[x][y]++,t[x][z+1]--
using namespace std;
long long T,n,LOG;
char ch;
long long a[],t[][],mi[];
long long Mi[],ha[][];
int main()
{
for(scanf("%d",&T);T;T--)
{
for(ch=getchar();!isalpha(ch);ch=getchar());
for(n=;isalpha(ch);ch=getchar())
a[++n]=ch-'a';
LOG=;
for(int i=;i<=n;i<<=,++LOG) mi[LOG]=i;
Mi[]=;
for(int i=;i<=n;i++)
Mi[i]=Mi[i-]*%MOD;
for(int i=;i<=n;i++)
ha[i][]=a[i];
for(int i=;i<=LOG;i++)
for(int j=;j<=n-mi[i]+;j++)
ha[j][i]=ha[j][i-]*Mi[mi[i-]]%MOD+ha[j+mi[i-]][i-];
for(int i=;i<=n;i++)
t[][i]=,
t[][i]=;
for(int len=;len<=n/;len++)
{
for(int Now=,Nex=+len;Nex<=n;Now=Nex,Nex=Now+len)
{
int now=Now,nex=Nex;
for(int i=LOG;i>=;i--)
if(nex+mi[i]-<=n)
if(ha[now][i]==ha[nex][i])
now+=mi[i],nex+=mi[i];
int lcp=min(now-Now,len);
now=Now,nex=Nex;
for(int i=LOG;i>=;i--)
if(now>=mi[i])
if(ha[now-mi[i]+][i]==ha[nex-mi[i]+][i])
now-=mi[i],nex-=mi[i];
int lcs=min(Now-now,len);
now=Now,nex=Nex;
if(lcp+lcs>=len)
{
ad(,nex-lcs+len,nex+lcp-);
ad(,now-lcs+,now+lcp-len);
}
}
}
for(int i=;i<=n;i++)
t[][i]+=t[][i-],
t[][i]+=t[][i-];
long long ans=;
for(int i=;i<n;i++)
ans+=t[][i]*t[][i+];
printf("%lld\n",ans);
}
return ;
}

bzoj4650: [Noi2016]优秀的拆分 hash的更多相关文章

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  8. bzoj千题计划317:bzoj4650: [Noi2016]优秀的拆分(后缀数组+差分)

    https://www.lydsy.com/JudgeOnline/problem.php?id=4650 如果能够预处理出 suf[i] 以i结尾的形式为AA的子串个数 pre[i] 以i开头的形式 ...

  9. 题解【bzoj4650 [NOI2016]优秀的拆分】

    Description 求对每一个连续字串将它切割成形如 AABB 的形式的方案数之和 Solution 显然 AABB 是由两个 AA 串拼起来的 考虑维护两个数组 a[i] 和 b[i] ,其中 ...

随机推荐

  1. 草原psd素材

    草原PSD素材,草原,风景,蓝天白云,飞鸟,阳光,绿色,草地. http://www.huiyi8.com/caoyuan/psd/

  2. 分享知识-快乐自己:2017IDEA破解教程

    首先 修改host文件: 文件路径:C:\Windows\System32\drivers\etc\hosts 修改:将“0.0.0.0 account.jetbrains.com”追加到hosts文 ...

  3. ES设置字段搜索权重——Query-Time Boosting

    Query-Time Boosting In Prioritizing Clauses, we explained how you could use the boost parameter at s ...

  4. smack

    XMPP/Smack/Openfire javax.net.ssl.SSLException: Received fatal alert: internal_error 解决: 1.在链接openfi ...

  5. python基础-文本操作

    文件IO #文件的基本操作 1.在python中你可以用file对象做大部分的文件操作 2.一般步骤: 先用python内置的open()函数打开一个文件,并创建一个file对象, 然后调用相关方法进 ...

  6. mongodb 常用操作符

    最近常用mongodb数据库,但是很多操作符不清楚或不知道,所有抽空根据手册整理下,以便于以后查阅(基于3.4版本) 1.查询和投影操作符 1.1比较操作符 $eq 匹配字段值等于指定值的文档 { & ...

  7. BZOJ4889:[TJOI2017]不勤劳的图书管理员

    浅谈树状数组与线段树:https://www.cnblogs.com/AKMer/p/9946944.html 题目传送门:https://www.lydsy.com/JudgeOnline/prob ...

  8. poj1734Sightseeing trip——无向图求最小环

    题目:http://poj.org/problem?id=1734 无向图求最小环,用floyd: 在每个k点更新f[i][j]之前,以k点作为直接连到i,j组成一个环的点,这样找一下最小环: 注意必 ...

  9. Divide Two Integers-不用'/' '*' '%'操作实现整数的除法

    题目描述: 不用 '*' '/' 和 '%' 运算实现两个整数的除法 题目来源:http://oj.leetcode.com/problems/divide-two-integers/ 题目分析: 例 ...

  10. 微信小程序开发之日期组件

    一: wxml: <view class="navbarlift" style="background:#ffffff;padding:20rpx"> ...