热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

DistinctSubstringsspoj694(不重复子串个数)

题目大意:RT分析:练手题目.后缀数组确实很强大..多理解height数组,切勿使用模版,后缀数组本身就有很多细节,多犯错更有利理解这个算

题目大意:RT

 
分析:练手题目....后缀数组确实很强大.....多理解height数组, 切勿使用模版,后缀数组本身就有很多细节,多犯错更有利理解这个算法。
 
代码如下:
=====================================================================================================================
 
#include
#include<string.h>
#include
using namespace std;

const int MAXN = 1007;

struct SuffixArr
{
    int tempx[MAXN], tempy[MAXN], text[MAXN];
    int rank[MAXN], sa[MAXN], sum[MAXN], height[MAXN];
    int *x, *y, N, MaxId;

    void GetText(char s[])
    {
        N = strlen(s)+1;
        x = tempx, y = tempy, MaxId=300;

        for(int i=0; i)
        {
            text[i] = x[i] = (int)s[i];
            y[i] = i;
        }
    }
    bool cmp(int i, int len)
    {
        if(sa[i]+len>N || sa[i-1]+len>N)
            return false;
        if(y[sa[i]] != y[sa[i-1]] || y[sa[i]+len] != y[sa[i-1]+len])
            return false;

        return true;
    }
    void BaseSort()
    {
        for(int i=0; i)
            sum[i] = 0;
        for(int i=0; i)
            sum[ x[ y[i] ] ] += 1;
        for(int i=1; i)
            sum[i] += sum[i-1];
        for(int i=N-1; i>=0; i--)
            sa[ --sum[ x[ y[i] ] ] ] = y[i];
    }
    void GetSa()
    {
        BaseSort();

        for(int len=1; len<=N; len<<=1)
        {
            int id = 0;

            for(int i=N-len; i)
                y[id++] = i;
            for(int i=0; iif(sa[i] >= len)
                y[id++] = sa[i]-len;

            BaseSort();
            swap(x, y);
            x[ sa[0] ] = id = 0;

            for(int i=1; i)
            {
                if(cmp(i, len) == true)
                    x[sa[i]] = id;
                else
                    x[sa[i]] = ++id;
            }

            MaxId = id+1;

            if(MaxId >= N)break;
        }
    }
    void GetHeight()
    {
        for(int i=0; i)
            rank[sa[i]] = i;

        for(int k=0, i=0; i)
        {
            if(!rank[i])
            {
                height[0] = k = 0;
                continue;
            }
            if(k)k--;

            int pre = sa[ rank[i]-1 ];

            while(text[i+k] == text[pre+k])
                k++;
            height[rank[i]] = k;
        }
    }
    int TotalSonArr()
    {
        int sum = 0;

        for(int i=0; i)
            sum += N-sa[i]-1-height[i];

        return sum;
    }
    void debug(int p[])
    {
        for(int i=0; i)
            printf("%d ", p[i]);
        printf("\n");
    }
};

SuffixArr suf;
char s[MAXN];

int main()
{
    int T;

    scanf("%d", &T);

    while(T--)
    {
        scanf("%s", s);

        suf.GetText(s);
        suf.GetSa();
        suf.GetHeight();
        int ans = suf.TotalSonArr();

        printf("%d\n", ans);
    }

    return 0;
}

Distinct Substrings - spoj 694(不重复子串个数)


推荐阅读
  • NX二次开发:UFUN点收集器UF_UI_select_point_collection详解
    本文介绍了如何在NX中使用UFUN库进行点收集器的二次开发,包括必要的头文件包含、初始化和选择点集合的具体实现。 ... [详细]
  • malloc 是 C 语言中的一个标准库函数,全称为 memory allocation,即动态内存分配。它用于在程序运行时申请一块指定大小的连续内存区域,并返回该区域的起始地址。当无法预先确定内存的具体位置时,可以通过 malloc 动态分配内存。 ... [详细]
  • 本文介绍了如何在 ASP.NET 中设置 Excel 单元格格式为文本,获取多个单元格区域并作为表头,以及进行单元格合并、赋值、格式设置等操作。 ... [详细]
  • packagecom.panchan.tsmese.utils;importjava.lang.reflect.ParameterizedType;importjava.lang. ... [详细]
  • 【线段树】  本质是二叉树,每个节点表示一个区间[L,R],设m(R-L+1)2(该处结果向下取整)左孩子区间为[L,m],右孩子区间为[m ... [详细]
  • 蒜头君的倒水问题(矩阵快速幂优化)
    蒜头君将两杯热水分别倒入两个杯子中,每杯水的初始量分别为a毫升和b毫升。为了使水冷却,蒜头君采用了一种特殊的方式,即每次将第一杯中的x%的水倒入第二杯,同时将第二杯中的y%的水倒入第一杯。这种操作会重复进行k次,最终求出两杯水中各自的水量。 ... [详细]
  • 经过一年的思考,我发现自己对开发的兴趣并不浓厚,而对算法研究则更加热衷。本文将探讨开发与算法之间的本质差异,并分享我的未来学习计划。 ... [详细]
  • Leetcode学习成长记:天池leetcode基础训练营Task01数组
    前言这是本人第一次参加由Datawhale举办的组队学习活动,这个活动每月一次,之前也一直关注,但未亲身参与过,这次看到活动 ... [详细]
  • Manacher算法详解:寻找最长回文子串
    本文将详细介绍Manacher算法,该算法用于高效地找到字符串中的最长回文子串。通过在字符间插入特殊符号,Manacher算法能够同时处理奇数和偶数长度的回文子串问题。 ... [详细]
  • 本文介绍了多种开源数据库及其核心数据结构和算法,包括MySQL的B+树、MVCC和WAL,MongoDB的tokuDB和cola,boltDB的追加仅树和mmap,levelDB的LSM树,以及内存缓存中的一致性哈希。 ... [详细]
  • Python多线程详解与示例
    本文介绍了Python中的多线程编程,包括僵尸进程和孤儿进程的概念,并提供了具体的代码示例。同时,详细解释了0号进程和1号进程在系统中的作用。 ... [详细]
  • A*算法在AI路径规划中的应用
    路径规划算法用于在地图上找到从起点到终点的最佳路径,特别是在存在障碍物的情况下。A*算法是一种高效且广泛使用的路径规划算法,适用于静态和动态环境。 ... [详细]
  • HTTP(HyperTextTransferProtocol)是超文本传输协议的缩写,它用于传送www方式的数据。HTTP协议采用了请求响应模型。客服端向服务器发送一 ... [详细]
  • 为什么多数程序员难以成为架构师?
    探讨80%的程序员为何难以晋升为架构师,涉及技术深度、经验积累和综合能力等方面。本文将详细解析Tomcat的配置和服务组件,帮助读者理解其内部机制。 ... [详细]
  • LDAP服务器配置与管理
    本文介绍如何通过安装和配置SSSD服务来统一管理用户账户信息,并实现其他系统的登录调用。通过图形化交互界面配置LDAP服务器,确保用户账户信息的集中管理和安全访问。 ... [详细]
author-avatar
奕殫的泪
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有