【洛谷 P2408】 不同子串个数(后缀自动机)
题目链接
裸体就是身体。
建出\(SAM\),\(DAG\)上跑\(DP\),\(f[u]=1+\sum_{(u,v)\in DAG}f[v]\)
答案为\(f[1]-1\)(因为根节点没有字符)
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int MAXN = 1000010;
struct SAM{
    int ch[26];
    int len, fa;
}sam[MAXN << 1];
int las = 1, cnt = 1;
long long f[MAXN << 1];
inline void add(int c){
    int p = las; int np = las = ++cnt;
    sam[np].len = sam[p].len + 1;
    for(; p && !sam[p].ch[c]; p = sam[p].fa) sam[p].ch[c] = np;
    if(!p) sam[np].fa = 1;
    else{
        int q = sam[p].ch[c];
        if(sam[q].len == sam[p].len + 1) sam[np].fa = q;
        else{
            int nq = ++cnt; sam[nq] = sam[q];
            sam[nq].len = sam[p].len + 1;
            sam[q].fa = sam[np].fa = nq;
            for(; p && sam[p].ch[c] == q; p = sam[p].fa) sam[p].ch[c] = nq;
        }
    }
}
char a[MAXN];
long long ans;
void dfs(int u){
    f[u] = 1;
    for(int i = 0; i < 26; ++i)
        if(sam[u].ch[i]){
            if(!f[sam[u].ch[i]])
                dfs(sam[u].ch[i]);
            f[u] += f[sam[u].ch[i]];
        }
}
int len;
int main(){
    scanf("%d", &len);
    scanf("%s", a + 1);
    for(int i = 1; i <= len; ++i)
       add(a[i] - 'a');
    dfs(1);
    printf("%lld\n", f[1] - 1);
    return 0;
}
												
											【洛谷 P2408】 不同子串个数(后缀自动机)的更多相关文章
- 洛谷P2408 不同子串个数 后缀数组 + Height数组
		
## 题目描述: 给你一个长为 $N$ $(N<=10^5)$ 的字符串,求不同的子串的个数我们定义两个子串不同,当且仅当有这两个子串长度不一样 或者长度一样且有任意一位不一样.子串的定义:原字 ...
 - [洛谷P2408]不同子串个数
		
题目大意:给你一个字符串,求其中本质不同的字串的个数 题解:同[洛谷P4070][SDOI2016]生成魔咒,只要最后再输出就行了 卡点:无 C++ Code: #include <cstdio ...
 - 【文文殿下】洛谷P2408 不同子串个数
		
题目链接https://www.luogu.org/problemnew/show/P2408 SAM裸题,大力求就行了 #include<cstdio> #include<cstr ...
 - 洛谷P3804 【模板】后缀自动机
		
题目描述 给定一个只包含小写字母的字符串 SS , 请你求出 SS 的所有出现次数不为 11 的子串的出现次数乘上该子串长度的最大值. 输入输出格式 输入格式: 一行一个仅包含小写字母的字符串 SS ...
 - 洛谷P3966 [TJOI2013]单词(后缀自动机)
		
传送门 统计单词出现次数……为啥大家都是写AC自动机的嘞……明明后缀自动机也能做的说…… 统计出现次数这个就直接按长度排序然后做个dp就好,这是SAM的板子的要求啊,不提了 然后考虑怎么让所有串之间隔 ...
 - 洛谷 P3804 【模板】后缀自动机 统计单词出现次数
		
后缀自动机模板题. 关键时求解每个节点的 $right$ 大小. 由于后缀自动机在构建时会保证点和点的 $right$ 只可能没有交集,或者一个是另一个的真子集,我们可以不重复的对 $right$ 进 ...
 - 洛谷P2178 [NOI2015]品酒大会(后缀自动机 线段树)
		
题意 题目链接 Sol 说一个后缀自动机+线段树的无脑做法 首先建出SAM,然后对parent树进行dp,维护最大次大值,最小次小值 显然一个串能更新答案的区间是\([len_{fa_{x}} + 1 ...
 - 【刷题】洛谷 P3804 【模板】后缀自动机
		
题目描述 给定一个只包含小写字母的字符串 \(S\) , 请你求出 \(S\) 的所有出现次数不为 \(1\) 的子串的出现次数乘上该子串长度的最大值. 输入输出格式 输入格式: 一行一个仅包含小写字 ...
 - 洛谷 P3804 【模板】后缀自动机
		
来一份模板 #include<cstdio> #include<algorithm> #include<cstring> #include<queue> ...
 - LUOGU P2408 不同子串个数(后缀数组)
		
传送门 解题思路 后缀数组求本质不同串的裸题.\(ans=\dfrac{n(n+1)}{2} -\sum height[i]\). 代码 #include<iostream> #inclu ...
 
随机推荐
- 关于python的深拷贝和浅拷贝
			
写类函数的时候出了一个错,原代码写在这里: def Update(self, wm, vm, ts, pos, vn, att): # 上一时刻位置,速度 pos_pre = pos self.pos ...
 - OpenFOAM——设置自定义非均匀场区域
			
在使用OpenFOAM进行计算的时候,我们需要对计算域设置非均匀场,比如最典型的溃坝算例,在开始计算以前,我们需要首先设定某一区域的水的体积分数为1,就是下面这样的: 有可能我们在计算传热问题的时候, ...
 - 数据仓库DW、ODS、DM概念及其区别
			
整体结构 在具体分析数据仓库之前先看下一下数据中心的整体架构以及数据流向 数据中心整体架构.png DB 是现有的数据来源,可以为mysql.SQLserver.文件日志等,为数据仓库提供数据来源 ...
 - 剑指offer:整数中1出现的次数
			
题目描述: 求出1~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1.10.11.12.13因此共出现6次,但是对于后面问题他就没辙了 ...
 - 时针分针角度问题c语言解法
			
#include <stdio.h> //时针一小时走30度 double hour_per_hour_angle = 30.0; //先算出时针和分钟 一分钟内 分别走多少度数 //时针 ...
 - 如何在真实串口驱动还未加载的情况下调试uboot?
			
1. 先找出真实串口是什么型号 1.1 怎么找?笔者提供两种方案: 方案一: 若当前的板子支持dm,从uboot的dts找串口节点对应的compatible属性 方案二: 从linux内核的dts找串 ...
 - LinQ中List,取某个字段,然后用逗号拼接
			
string htDetails = string.Join(",", DemoList.Select(t => t.id).Distinct().ToArray());
 - [LeetCode] 774. Minimize Max Distance to Gas Station 最小化加油站间的最大距离
			
On a horizontal number line, we have gas stations at positions stations[0], stations[1], ..., statio ...
 - mysql 5.7 sql_mode设置 坑
			
原文地址:https://blog.csdn.net/u012259256/article/details/56482218 1.查看sql_mode select @@sql_mode查询出来的值为 ...
 - 【视频开发】【Live555】通过live555实现H264 RTSP直播
			
前面的文章中介绍了<H264视频通过RTMP流直播>,下面将介绍一下如何将H264实时视频通过RTSP直播. 实现思路是将视频流发送给live555, 由live555来实现H264数据流 ...