首页 > 其他分享 >[AHOI2013] 差异 题解

[AHOI2013] 差异 题解

时间:2024-07-10 10:33:33浏览次数:12  
标签:sam int 题解 差异 AHOI2013 long ans sum

后缀自动机维护子串公共后缀方便一点,所以直接倒序插入字符串即可。

我们给所有前缀打上标记,然后跑树形 \(dp\),设 \(sum_i\) 表示第 \(i\) 个点的子树内有多少个前缀,\(ans\) 统计 \(\sum \text{LCP}(T_i,T_j)\),则有:

\[ans=\sum\limits_{i=1}^{id}\sum\limits_{j\in ison} {sum}_j({sum}_i-{sum}_j) \]

简化求解式发现就是 \(\dfrac{n(n-1)(n+1)}{2}-ans\),时间复杂度 \(O(n)\)。

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=1e6+5;
struct SAM{
	int id,sm[N],ln[N];
	int tl,tr[N][26],pr[N];
	vector<int>g[N];ll ans;
	SAM(){pr[0]=-1;}
	void cpy(int x,int y){
		for(int i=0;i<26;i++)
			tr[x][i]=tr[y][i];
		pr[x]=pr[y];ln[x]=ln[y];
	}void add(int x){
		ln[++id]=ln[tl]+1;
		int p=tl;tl=id;
		while(~p&&!tr[p][x])
			tr[p][x]=id,p=pr[p];
		if(p<0){
			sm[tl]++;
			return;
		}int u=p,v=tr[p][x];
		if(ln[u]+1==ln[v]){
			pr[id]=v;
			sm[tl]++;
			return;
		}cpy(++id,v);
		ln[id]=ln[u]+1;
		pr[v]=pr[id-1]=id;
		while(~p&&tr[p][x]==v)
			tr[p][x]=id,p=pr[p];
		sm[tl]++;
	}void jb(){
		for(int i=1;i<=id;i++)
			g[pr[i]].push_back(i);
	}void dfs(int x){
		ll sum=sm[x];
		for(int i=0;i<g[x].size();i++){
			int y=g[x][i];dfs(y);
			ans+=sum*sm[y]*ln[x];
			sum+=sm[y];
		}sm[x]=sum;
	}
}sam;char s[N];int n;
int main(){
	ios::sync_with_stdio(0);
	cin.tie(0);cout.tie(0);
	cin>>s;n=strlen(s);
	for(int i=n-1;~i;i--)
		sam.add(s[i]-'a');
	sam.jb();sam.dfs(0);
	cout<<(ll)(n-1)*n*(n+1)/2-sam.ans*2;
	return 0;
}//man!what can I say!

标签:sam,int,题解,差异,AHOI2013,long,ans,sum
From: https://www.cnblogs.com/chang-an-22-lyh/p/18293380/ahio2013-chayi_tj

相关文章

  • 洛谷 P1853 投资的最大效益 蒟蒻题解
    洛谷P1853投资的最大效益蒟蒻题解题目背景约翰先生获得了一大笔遗产,他暂时还用不上这一笔钱,他决定进行投资以获得更大的效益。银行工作人员向他提供了多种债券,每一种债券都能在固定的投资后,提供稳定的年利息。当然,每一种债券的投资额是不同的,一般来说,投资越大,收益也越大,而......
  • Educational_round94题解
    Educational_round94题解A.StringSimilarity(构造+思维)解题思路原字符串长度为$2*n-1$,需要匹配的字符串一共有$n$个,要使所有字符串都得到匹配,即让构造的长度为$n$的字符串每一个位置都能匹配到一个。可得到$w_i=s_{2i}$题解#include<iostream>usingnamespacestd;chars......
  • 2024年06月CCF-GESP编程能力等级认证Python编程三级真题解析
    本文收录于专栏《Python等级认证CCF-GESP真题解析》,专栏总目录:点这里,订阅后可阅读专栏内所有文章。一、单选题(每题2分,共30分)第1题小杨父母带他到某培训机构给他报名参加CCF组织的GESP认证考试的第1级,那他可以选择的认证语言有几种?()A.1B.2C.3D.4答案:C第......
  • 题解 - 修剪草坪
    题目(in洛谷)或题目(inhszxoj)题目大意给定\(n\)个非负整数\(a_1\cdotsa_n\)。现在你可以选择其中若干个数,但不能有超过\(k\)个连续的数字被选择。求选出的数字的和最大。思路简析一个比较好的思路是反向思考:选择某些间隔小于等于\(k\)(相邻间隔为\(0\))的数字,求选......
  • Codeforces Round 956 (Div. 2) 部分题解A~C
    A.ArrayDivisibility题目大意构造长度为n的数组,满足:所有j的aj之和可以被k整除,其中j是k的倍数,k的取值为1~n。思路构造序列1->n即可满足条件。代码实现voidsolve(){  lln;cin>>n;  for(inti=1;i<=n;i++)cout<<i<<"";  cout<<"\n"......
  • joi2022_yo2_c 国土分割 (Land Division) 题解
    国土分割(LandDivision)推销我的洛谷博客。题意给定一个\(n\timesm\)的矩阵\(a\),你需要选择在横向或纵向分割至少一次,使得每个分割出来的小矩阵的\(a_{i,j}\)之和相等。数据范围\(1\leqslantn,m\leqslant50\)。\(1\leqslanta_{i,j}\leqslant10^5\)。思......
  • 题解 - 幻象迷宫
    题目in洛谷或题目inCF题目幻象迷宫可以认为是无限大的,不过它由若干个\(N\timesM\)的矩阵重复组成。矩阵中有的地方是道路,用\(\verb!.!\)表示;有的地方是墙,用\(\verb!#!\)表示。起始位置用\(\verb!S!\)表示。也就是对于迷宫中的一个点\((x,y)\),如果\((x\bmodn,y......
  • UVA12342 Tax Calculator 题解
    题目传送门题目大意题目描述某国所得税计算十分复杂。该国政府指定你制作一个自动计算所得税的程序。以下是该国计算所得税的规则:所得税免征额为180000180000......
  • P10719 的题解
    (一)设\(a_{x,y}\)为从\((1,1)(x,y)\)矩形中的\(1\)的数量。然后通过二位前缀和可以\(O(1)\)算。注意到\(1\len,m\le100\)。先确定矩形右下角,对于左上角,先确定在哪一行,再二分在哪一列。(二)AC代码。#include<bits/stdc++.h>#definepbpush_back#definefifirs......
  • 【Py/Java/C++三种语言OD独家2024D卷真题】20天拿下华为OD笔试之【前缀和/固定滑窗】2
    有LeetCode算法/华为OD考试扣扣交流群可加948025485可上欧弟OJ系统练习华子OD、大厂真题绿色聊天软件戳od1441了解算法冲刺训练(备注【CSDN】否则不通过)文章目录题目描述与示例题目描述输入描述输出描述示例一输入输出说明示例二输入输出说明解题思路贪心思想......