http://www.spoj.com/problems/NSUBSTR/

clj课件里的例题

用结构体+指针写完模板后发现要访问所有的节点,改成数组会更方便些。。于是改成了数组。。。

这道题重点是求一个状态的\(|Right|\)值,只要用parent树中当前节点的所有孩子来更新它即可。

为了保证一个节点的parent一定被所有孩子全部更新,需要保证在序列中一个节点的parent一定在它的左边(从右往左扫来更新)。

这就需要对\(val\)值排序,因为spoj时限卡得紧,所以用基数排序。

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N = 1000003; int val[N], par[N], go[N][26], tot = 1, root = 1, last = 1; void extend(int w) {
int p = last, np = ++tot;
val[np] = val[p] + 1;
while (p && go[p][w] == 0)
go[p][w] = np, p = par[p];
if (p == 0) par[np] = root;
else {
int q = go[p][w];
if (val[p] + 1 == val[q]) par[np] = q;
else {
int nq = ++tot; val[nq] = val[p] + 1;
memcpy(go[nq], go[q], sizeof(go[q]));
par[nq] = par[q];
par[q] = par[np] = nq;
while (p && go[p][w] == q)
go[p][w] = nq, p = par[p];
}
}
last = np;
} int len, r[N], a[250003], id[N], c[250003], f[250003];
char s[250003];
int main() {
scanf("%s", s + 1);
len = strlen(s + 1);
for(int i = 1; i <= len; ++i)
a[i] = s[i] - 'a', extend(a[i]);
int tmp = root;
for(int i = 1; i <= len; ++i) {
tmp = go[tmp][a[i]];
r[tmp] = 1;
}
for(int i = 1; i <= tot; ++i)
++c[val[i]];
for(int i = 1; i <= len; ++i)
c[i] += c[i - 1];
for(int i = 1; i <= tot; ++i)
id[c[val[i]]--] = i;
for(int i = tot; i >= 1; --i)
r[par[id[i]]] += r[id[i]];
for(int i = 1; i <= tot; ++i)
f[val[i]] = max(f[val[i]], r[i]);
for(int i = len; i >= 1; --i)
f[i - 1] = max(f[i], f[i - 1]);
for(int i = 1; i <= len; ++i)
printf("%d\n", f[i]);
return 0;
}

【SPOJ 8222】Substrings的更多相关文章

  1. 【spoj NSUBSTR】 Substrings

    http://www.spoj.com/problems/NSUBSTR/ (题目链接) 题意 给出一个字符串S,令${F(x)}$表示S的所有长度为x的子串出现次数的最大值.求${F(1)..... ...

  2. 【SPOJ -NSUBSTR】Substrings 【后缀自动机+dp】

    题意 给出一个字符串,要你找出所有长度的子串分别的最多出现次数. 分析 我们建出后缀自动机,然后预处理出每个状态的cnt,cnt[u]指的是u这个状态的right集合大小.我们设f[len]为长度为l ...

  3. 【 SPOJ - GRASSPLA】 Grass Planting (树链剖分+树状数组)

    54  种草约翰有 N 个牧场,编号为 1 到 N.它们之间有 N − 1 条道路,每条道路连接两个牧场.通过这些道路,所有牧场都是连通的.刚开始的时候,所有道路都是光秃秃的,没有青草.约翰会在一些道 ...

  4. 【刷题】SPOJ 8222 NSUBSTR - Substrings

    You are given a string S which consists of 250000 lowercase latin letters at most. We define F(x) as ...

  5. 【SPOJ 694】Distinct Substrings (更直接的求法)

    [链接]h在这里写链接 [题意] 接上一篇文章 [题解] 一个字符串所有不同的子串的个数=∑(len-sa[i]-height[i]) [错的次数] 0 [反思] 在这了写反思 [代码] #inclu ...

  6. 【SPOJ 694】Distinct Substrings

    [链接]h在这里写链接 [题意]     给你一个长度最多为1000的字符串     让你求出一个数x,这个x=这个字符串的不同子串个数; [题解]     后缀数组题.     把原串复制一份,加在 ...

  7. 【spoj SUBST1】 New Distinct Substrings

    http://www.spoj.com/problems/SUBST1/ (题目链接) 题意 求字符串的不相同的子串个数 Solution 后缀数组论文题. 每个子串一定是某个后缀的前缀,那么原问题等 ...

  8. 【SPOJ – SUBST1】New Distinct Substrings 后缀数组

    New Distinct Substrings 题意 给出T个字符串,问每个字符串有多少个不同的子串. 思路 字符串所有子串,可以看做由所有后缀的前缀组成. 按照后缀排序,遍历后缀,每次新增的前缀就是 ...

  9. 【SPOJ 694】Distinct Substrings 不相同的子串的个数

    不会FQ啊,没法评测啊,先存一下代码QAQ 2016-06-16神犇Menci帮我测过AC了,谢谢神犇Menci QwQ #include<cstdio> #include<cstr ...

随机推荐

  1. PHPstudy和ecshop的安装和使用

    PHPstudy和ecshop: phpStudy是一个PHP调试环境的程序集成包. 该程序包集成最新的Apache+PHP+MySQL+phpMyAdmin+ZendOptimizer,一次性安装, ...

  2. SQL2012连接字符串

    安装了sqlserver2012数据库,测试一包代码,搜索网上的方法,死活连接不上,最后偶然测试通过,居然是连接字符串的问题. “如果开发软件的时候是在局域网或者是在本机,并且数据库不在远程计算机上面 ...

  3. Linq语法详细(转)

    原文地址:http://www.cnblogs.com/knowledgesea/p/3897665.html 开门见山 读这篇文章之前,我先说下,每一种搜索结果集,我都以三种方式变现出来,为啦更好的 ...

  4. IE兼容forEach/map/every/some/indexOf/filter

    some if (!Array.prototype.some){ Array.prototype.some = function(fun /*, thisArg */) { 'use strict'; ...

  5. http协议(八)请求首部字段

    请求首部字段 定义:请求首部字段是从客户端到服务器发送请求报文中所使用的字段,里面包含了附加信息.客户端信息以及对响应内容相关的优先级等内容 1.Accept 通知服务器用户代理可处理的媒体类型及媒体 ...

  6. python实现一个图灵机器人

    这标题就是个噱头...其实用的别人的接口,就是这货. 下面是代码: # -*- coding: utf-8 -*- import urllib,urllib2 import sys import js ...

  7. javascript数组对象排序

    javascript数组对象排序 JavaScript数组内置排序函数 javascript内置的sort函数是多种排序算法的集合 JavaScript实现多维数组.对象数组排序,其实用的就是原生的s ...

  8. 几种.NET平台数据持久化框架介绍

    原文连接:http://yuxnet.blog.163.com/blog/static/164863495201131532223362/ 在.NET平台下,关于数据持久层框架非常多,本文主要对如下几 ...

  9. 将函数传给webworker

    var zWorker = function (func,cb){ var node = document.createElement('script'),workerId='worker' + Da ...

  10. 将Vim改造为强大的IDE—Vim集成Ctags/Taglist/Cscope/Winmanager/NERDTree/OmniCppComplete(有图有真相)(转)

    1.安装Vim和Vim基本插件首先安装好Vim和Vim的基本插件.这些使用apt-get安装即可:lingd@ubuntu:~/arm$sudo apt-get install vim vim-scr ...