SA后缀数组模板 文件修复

2024-05-29 03:32
文章标签 模板 数组 后缀 修复 sa

本文主要是介绍SA后缀数组模板 文件修复,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

记数排序

void ssort()
{memset(a,0,sizeof(a));int mx=0;fo(i,1,n) a[x[y[i]]]++,mx=max(mx,x[y[i]]);fo(i,1,mx) a[i]+=a[i-1];for(int i=n;i>0;i--) sa[a[x[y[i]]]]=y[i],a[x[y[i]]]--;
}

求SA和rank

x为排序后的字符串,y为排序第二关键字,sa[i]为排第i是什么,rank[i]为第i排第几
height[i]为sa[i]和sa[i-1]的最长公共前缀

void getsa()
{fo(i,1,n) y[i]=i,x[i]=s[i];ssort();for(int j=1;j<=n;j*=2){int k=0;fo(i,n-j+1,n) y[++k]=i;fo(i,1,n) if (sa[i]>j) y[++k]=sa[i]-j;ssort();fo(i,1,n) y[i]=x[i],x[i]=0;x[sa[1]]=1;k=1;fo(i,2,n){if (y[sa[i]]!=y[sa[i-1]] || y[sa[i]+j]!=y[sa[i-1]+j]) k++;x[sa[i]]=k;}if (k==n) break;}fo(i,1,n) rank[sa[i]]=i;
}

求height

void getheight()
{int k=0;fo(i,1,n){int j=sa[rank[i]-1];while (i+k<=n && j+k<=n && s[i+k]==s[j+k]) k++;height[rank[i]]=k;if (k>0) k--;}
}

完整代码

题目:文件修复

求字符串中至少出现两次的个数

#include <cstdio>
#include <cmath>
#include <algorithm>
#include <cstring>
#include <iostream>
#include <cstdlib>
#include <iostream>
#define fo(i,a,b) for(int i=a;i<=b;i++)
#define N 101000
using namespace std;
int n,i,j,k,a[N],sa[N],rank[N],height[N],x[N],y[N];
char s[N];
void ssort()
{memset(a,0,sizeof(a));int mx=0;fo(i,1,n) a[x[y[i]]]++,mx=max(mx,x[y[i]]);fo(i,1,mx) a[i]+=a[i-1];for(int i=n;i>0;i--) sa[a[x[y[i]]]]=y[i],a[x[y[i]]]--;
}
void getsa()
{fo(i,1,n) y[i]=i,x[i]=s[i];ssort();for(int j=1;j<=n;j*=2){int k=0;fo(i,n-j+1,n) y[++k]=i;fo(i,1,n) if (sa[i]>j) y[++k]=sa[i]-j;ssort();fo(i,1,n) y[i]=x[i],x[i]=0;x[sa[1]]=1;k=1;fo(i,2,n){if (y[sa[i]]!=y[sa[i-1]] || y[sa[i]+j]!=y[sa[i-1]+j]) k++;x[sa[i]]=k;}if (k==n) break;}fo(i,1,n) rank[sa[i]]=i;
}
void getheight()
{int k=0;fo(i,1,n){int j=sa[rank[i]-1];while (i+k<=n && j+k<=n && s[i+k]==s[j+k]) k++;height[rank[i]]=k;if (k>0) k--;}
}
int main()
{scanf("%s",s+1);n=strlen(s+1);getsa();getheight();int ans=0;fo(i,1,n) if (height[i]>height[i-1]) ans=ans+height[i]-height[i-1];printf("%d",ans);
}

这篇关于SA后缀数组模板 文件修复的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1012519

相关文章

利用Python打造一个Excel记账模板

《利用Python打造一个Excel记账模板》这篇文章主要为大家详细介绍了如何使用Python打造一个超实用的Excel记账模板,可以帮助大家高效管理财务,迈向财富自由之路,感兴趣的小伙伴快跟随小编一... 目录设置预算百分比超支标红预警记账模板功能介绍基础记账预算管理可视化分析摸鱼时间理财法碎片时间利用财

如何在 Spring Boot 中实现 FreeMarker 模板

《如何在SpringBoot中实现FreeMarker模板》FreeMarker是一种功能强大、轻量级的模板引擎,用于在Java应用中生成动态文本输出(如HTML、XML、邮件内容等),本文... 目录什么是 FreeMarker 模板?在 Spring Boot 中实现 FreeMarker 模板1. 环

快速修复一个Panic的Linux内核的技巧

《快速修复一个Panic的Linux内核的技巧》Linux系统中运行了不当的mkinitcpio操作导致内核文件不能正常工作,重启的时候,内核启动中止于Panic状态,该怎么解决这个问题呢?下面我们就... 感谢China编程(www.chinasem.cn)网友 鸢一雨音 的投稿写这篇文章是有原因的。为了配置完

Java数组初始化的五种方式

《Java数组初始化的五种方式》数组是Java中最基础且常用的数据结构之一,其初始化方式多样且各具特点,本文详细讲解Java数组初始化的五种方式,分析其适用场景、优劣势对比及注意事项,帮助避免常见陷阱... 目录1. 静态初始化:简洁但固定代码示例核心特点适用场景注意事项2. 动态初始化:灵活但需手动管理代

IDEA自动生成注释模板的配置教程

《IDEA自动生成注释模板的配置教程》本文介绍了如何在IntelliJIDEA中配置类和方法的注释模板,包括自动生成项目名称、包名、日期和时间等内容,以及如何定制参数和返回值的注释格式,需要的朋友可以... 目录项目场景配置方法类注释模板定义类开头的注释步骤类注释效果方法注释模板定义方法开头的注释步骤方法注

C++中初始化二维数组的几种常见方法

《C++中初始化二维数组的几种常见方法》本文详细介绍了在C++中初始化二维数组的不同方式,包括静态初始化、循环、全部为零、部分初始化、std::array和std::vector,以及std::vec... 目录1. 静态初始化2. 使用循环初始化3. 全部初始化为零4. 部分初始化5. 使用 std::a

shell编程之函数与数组的使用详解

《shell编程之函数与数组的使用详解》:本文主要介绍shell编程之函数与数组的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录shell函数函数的用法俩个数求和系统资源监控并报警函数函数变量的作用范围函数的参数递归函数shell数组获取数组的长度读取某下的

mss32.dll文件丢失怎么办? 电脑提示mss32.dll丢失的多种修复方法

《mss32.dll文件丢失怎么办?电脑提示mss32.dll丢失的多种修复方法》最近,很多电脑用户可能遇到了mss32.dll文件丢失的问题,导致一些应用程序无法正常启动,那么,如何修复这个问题呢... 在电脑常年累月的使用过程中,偶尔会遇到一些问题令人头疼。像是某个程序尝试运行时,系统突然弹出一个错误提

电脑提示找不到openal32.dll文件怎么办? openal32.dll丢失完美修复方法

《电脑提示找不到openal32.dll文件怎么办?openal32.dll丢失完美修复方法》openal32.dll是一种重要的系统文件,当它丢失时,会给我们的电脑带来很大的困扰,很多人都曾经遇到... 在使用电脑过程中,我们常常会遇到一些.dll文件丢失的问题,而openal32.dll的丢失是其中比较

电脑win32spl.dll文件丢失咋办? win32spl.dll丢失无法连接打印机修复技巧

《电脑win32spl.dll文件丢失咋办?win32spl.dll丢失无法连接打印机修复技巧》电脑突然提示win32spl.dll文件丢失,打印机死活连不上,今天就来给大家详细讲解一下这个问题的解... 不知道大家在使用电脑的时候是否遇到过关于win32spl.dll文件丢失的问题,win32spl.dl