bzoj3238: [Ahoi2013]差异
2016-08-19 11:38
218 查看
Description
Input
一行,一个字符串S
Output
一行,一个整数,表示所求值
Sample Input
cacao
Sample Output
54
HINT
2<=N<=500000,S由小写英文字母组成
简单来说就是求原串中所有后缀两两最长公共前缀之和..
那么只要把原串反过来做SAM,把原问题变成所有前缀两两最长公共后缀之和
然后就要用到2015集训队论文中的性质5
那么题解就是显而易见的啊..
Input
一行,一个字符串S
Output
一行,一个整数,表示所求值
Sample Input
cacao
Sample Output
54
HINT
2<=N<=500000,S由小写英文字母组成
简单来说就是求原串中所有后缀两两最长公共前缀之和..
那么只要把原串反过来做SAM,把原问题变成所有前缀两两最长公共后缀之和
然后就要用到2015集训队论文中的性质5
那么题解就是显而易见的啊..
#include <cstdio> #include <cstring> #include <cstdlib> #include <algorithm> #define LL long long using namespace std; const LL Maxn = 1000010; LL F[Maxn], d[Maxn], ch[Maxn][26], tot, now, size[Maxn], lca[Maxn]; char s[Maxn]; LL len; LL Rsort[Maxn], rk[Maxn]; LL copy ( LL p, LL c ){ LL x = ++tot, y = ch[p][c]; d[x] = d[p]+1; for ( LL i = 0; i < 26; i ++ ) ch[x][i] = ch[y][i]; F[x] = F[y]; F[y] = x; while ( ~p && ch[p][c] == y ){ ch[p][c] = x; p = F[p]; } return x; } void add ( LL c ){ LL p, o; if ( p = ch[now][c] ){ if ( d[p] != d[now]+1 ) copy ( now, c ); now = ch[now][c]; } else { d[o=++tot] = d[now]+1; p = now; now = o; while ( ~p && !ch[p][c] ){ ch[p][c] = o; p = F[p]; } F[o] = ~p ? ( d[p]+1 == d[ch[p][c]] ? ch[p][c] : copy ( p, c ) ) : 0; } } int main (){ LL i, j, k; scanf ( "%s", s+1 ); len = strlen (s+1); F[0] = -1; tot = now = 0; for ( i = len; i >= 1; i -- ){ add (s[i]-'a'); size[now] = 1; } for ( i = 1; i <= tot; i ++ ) Rsort[d[i]] ++; for ( i = 1; i <= len; i ++ ) Rsort[i] += Rsort[i-1]; for ( i = tot; i >= 1; i -- ) rk[Rsort[d[i]]--] = i; LL ans = 0; for ( i = tot; i >= 1; i -- ){ lca[F[rk[i]]] += size[F[rk[i]]]*size[rk[i]]; size[F[rk[i]]] += size[rk[i]]; ans += lca[rk[i]]*d[rk[i]]; } printf ( "%lld\n", (len-1)*len*(len+1)/2-2*ans ); return 0; }
相关文章推荐
- PL/SQL实例 navicat创建存储过程
- js循环数组各种方法array 汇总-基础
- C#中的ref和out的区别
- Best Time to Buy and Sell Stock with Cooldown -- LeetCode
- JavaWeb---JSTL(fmt格式化标签库)
- Python的数据库--MySQL结果集
- matalb k-means函数使用方法(附一个很好的k-means参考博客)
- 用application loader上传ipa包遇到的问题
- doGet与doPost的区别
- 前端面试-----CSS3新增属性之边框图片
- Mysql删除语句
- 2016.8.18 C组总结
- SQL日常汇集
- 【疑问笔记】window.onload vs $(document).ready vs defer
- 常用GIT bash 命令一览
- Android 九宫格解锁Demo--Android 进阶之路
- 学习设计模式-方法工厂设计模式
- iOS 开发中你是否遇到这些经验问题
- WebView详解(一)
- cc2541 硬件i2c 读AT24CM01