1009: 失恋的小 T

时间限制: 1 Sec  内存限制: 128 MB
提交: 160  解决: 76
[提交][状态][讨论版]

题目描述

小 T 最近失恋了,开始怀疑人生和爱情,他想知道在这世界中去伪存真后还剩多少。 
小 T 在网上拿到了代表大千世界的长字符串,删掉了所有换行空格和标点符号,只剩下了小写字母。 
现在字符串中有好多重复的子串,相同子串里只有一个是 Real 的。 
为了让小 T 走出失恋,你一定要告诉他这个世界上 Real 的东西有多少。 
(子串:串中任意个连续的字符组成的子序列称为该串的子串) 

输入

包含 100 组输入,每组为一行字符串,只包含小写字母,长度 1-5000。 

输出

输出 100 行,每行一个整数,对应输入的答案。 

样例输入

aaba

样例输出

8

提示

后缀数组,

我还不会,,

 #include<iostream>
#include<stdio.h>
#include<math.h>
#include <string>
#include<string.h>
#include<map>
#include<queue>
#include<set>
#include<utility>
#include<vector>
#include<algorithm>
#include<stdlib.h>
using namespace std;
#define maxn 200100
#define maxm 200005
#define rd(x) scanf("%d", &x)
#define rd2(x, y) scanf("%d%d", &x, &y)
#define mod 1000000007
const int MAXN = ;
int t1[MAXN],t2[MAXN],c[MAXN];
bool cmp(int *r, int a,int b,int l){
return r[a] ==r[b] && r[a+l] == r[b+l];
}
void da(int str[], int sa[], int rankk[], int height[], int n, int m){
n++;
int i,j,p,*x =t1,*y=t2;
for(i =; i <m; i++) c[i] =;
for(i = ; i <n; i++) c[x[i] =str[i]]++;
for(i =; i < m; i++) c[i] += c[i-];
for(i = n-;i >= ; i--) sa[--c[x[i]]] = i;
for(j =; j <= n; j <<=){
p =;
for(i = n-j; i <n; i++) y[p++] = i;
for(i = ; i < n; i++) if(sa[i] >= j) y[p++] = sa[i] -j; for(i = ; i < m; i++) c[i] =;
for(i = ;i < n; i++) c[x[y[i]]]++;
for(i = ; i < m; i++) c[i] += c[i-];
for(i = n-; i >=; i--) sa[--c[x[y[i]]]] = y[i];
swap(x,y);
p =; x[sa[]] =;
for(int i = ; i < n; i++) x[sa[i]] = cmp(y, sa[i-], sa[i], j)?p-:p++;
if(p >= n) break;
m =p;
}
int k =;
n--;
for(i = ; i <= n;i++) rankk[sa[i]] = i;
for(i = ; i < n;i++){
if(k) k--;
j =sa[rankk[i]-];
while(str[i+k] == str[j+k]) k++;
height[rankk[i]] = k;
}
}
int rankk[MAXN],height[MAXN];
char str[MAXN];
int r[MAXN],sa[MAXN];
int main()
{
int t = ;
while(~scanf("%s", str)){
//scanf("%s", str);
int len = strlen(str);
//int n = 2*len +1;
for(int i =; i < len ;i++) r[i] = str[i];
//for(int i =0; i < len; i++) r[len + 1 + i] = str[len -1 -i];
r[len] =;
r[len+] = ;
da(r, sa, rankk, height, len , 'z' + );
long long int res = len - sa[];
for(int i= ;i <= len; i++){
res = res + len - sa[i] -height[i];
}
printf("%lld\n", res);
}
return ;
}

1009 失恋的小 T(后缀数组¥)的更多相关文章

  1. 【bzoj5073】[Lydsy1710月赛]小A的咒语 后缀数组+倍增RMQ+贪心+dp

    题目描述 给出 $A$ 串和 $B$ 串,从 $A$ 串中选出至多 $x$ 个互不重合的段,使得它们按照原顺序拼接后能够得到 $B$ 串.求是否可行.多组数据. $T\le 10$ ,$|A|,|B| ...

  2. BZOJ 4199: [Noi2015]品酒大会 [后缀数组 带权并查集]

    4199: [Noi2015]品酒大会 UOJ:http://uoj.ac/problem/131 一年一度的“幻影阁夏日品酒大会”隆重开幕了.大会包含品尝和趣味挑战两个环节,分别向优胜者颁发“首席品 ...

  3. BZOJ 1692: [Usaco2007 Dec]队列变换 [后缀数组 贪心]

    1692: [Usaco2007 Dec]队列变换 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 1383  Solved: 582[Submit][St ...

  4. POJ1743 Musical Theme [后缀数组]

    Musical Theme Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 27539   Accepted: 9290 De ...

  5. 后缀数组(suffix array)详解

    写在前面 在字符串处理当中,后缀树和后缀数组都是非常有力的工具. 其中后缀树大家了解得比较多,关于后缀数组则很少见于国内的资料. 其实后缀数组是后缀树的一个非常精巧的替代品,它比后缀树容易编程实现, ...

  6. (HDU 5558) 2015ACM/ICPC亚洲区合肥站---Alice's Classified Message(后缀数组)

    题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=5558 Problem Description Alice wants to send a classi ...

  7. hihoCoder 后缀数组 重复旋律

    #1403 : 后缀数组一·重复旋律 时间限制:5000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi平时的一大兴趣爱好就是演奏钢琴.我们知道一个音乐旋律被表示为长度为 N 的数构成 ...

  8. 后缀数组:倍增法和DC3的简单理解

    一些定义:设字符串S的长度为n,S[0~n-1]. 子串:设0<=i<=j<=n-1,那么由S的第i到第j个字符组成的串为它的子串S[i,j]. 后缀:设0<=i<=n- ...

  9. POJ 3415 Common Substrings 后缀数组+并查集

    后缀数组,看到网上很多题解都是单调栈,这里提供一个不是单调栈的做法, 首先将两个串 连接起来求height   求完之后按height值从大往小合并.  height值代表的是  sa[i]和sa[i ...

随机推荐

  1. MariaDB数据库主从复制实现步骤

    一.MariaDB简介 MariaDB数据库的主从复制方案,是其自带的功能,并且主从复制并不是复制磁盘上的数据库文件,而是通过binlog日志复制到需要同步的从服务器上. MariaDB数据库支持单向 ...

  2. Linux centos下设置定时备份任务

    实现准备 # 需要备份文件路径:/opt/apollo/logs/access_log [root@localhost opt]# cd apollo/ [root@localhost apollo] ...

  3. 数据库之MySQL(二)

    数据表基本 1.创建表 create table 表名(   列名  类型  是否可以为空,   列名  类型  是否可以为空)ENGINE=InnoDB DEFAULT CHARSET=utf8 是 ...

  4. C++学习之旅get、getline的使用方法

    C++学习之旅get.getline的使用方法 面向行的输入:cin.getline(). 该函数读取整行.它使用通过回车键输入的换行符来确定输入结尾.要调用这样的方法,能够使用cin.getline ...

  5. Linux服务管理(开启关闭防火墙)

    1.firewalld的基本使用 启动: systemctl start firewalld 关闭: systemctl stop firewalld 查看状态: systemctl status f ...

  6. Python通过fork的方式防止僵尸进程

    import subprocess import os import sys import platform def fock_new(func): def inner(*args, **kwargs ...

  7. ZRGGBS00 GGB1替代问题

    ZRGGBS00ZRGGBS00ZRGGBS00 和Validation不同的是,Validation只做检测,一般不做相应数据的修改,Substitution弥补了这反面的缺陷,它和user exi ...

  8. four application:geocoder widget

    <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...

  9. VSCode隐藏node_modules目录

    使用VSCode,打开一个工程时,发现node_modules目录包含到工程中了,问题: settings.json配置如下,可以自己定制忽略的文件夹: search.exclude 用来忽略搜索的文 ...

  10. CSS伪元素实现的3D按钮

    在线演示 本地下载