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

相关文章

Java中的数组与集合基本用法详解

《Java中的数组与集合基本用法详解》本文介绍了Java数组和集合框架的基础知识,数组部分涵盖了一维、二维及多维数组的声明、初始化、访问与遍历方法,以及Arrays类的常用操作,对Java数组与集合相... 目录一、Java数组基础1.1 数组结构概述1.2 一维数组1.2.1 声明与初始化1.2.2 访问

MySQL查询JSON数组字段包含特定字符串的方法

《MySQL查询JSON数组字段包含特定字符串的方法》在MySQL数据库中,当某个字段存储的是JSON数组,需要查询数组中包含特定字符串的记录时传统的LIKE语句无法直接使用,下面小编就为大家介绍两种... 目录问题背景解决方案对比1. 精确匹配方案(推荐)2. 模糊匹配方案参数化查询示例使用场景建议性能优

关于集合与数组转换实现方法

《关于集合与数组转换实现方法》:本文主要介绍关于集合与数组转换实现方法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、Arrays.asList()1.1、方法作用1.2、内部实现1.3、修改元素的影响1.4、注意事项2、list.toArray()2.1、方

qt5cored.dll报错怎么解决? 电脑qt5cored.dll文件丢失修复技巧

《qt5cored.dll报错怎么解决?电脑qt5cored.dll文件丢失修复技巧》在进行软件安装或运行程序时,有时会遇到由于找不到qt5core.dll,无法继续执行代码,这个问题可能是由于该文... 遇到qt5cored.dll文件错误时,可能会导致基于 Qt 开发的应用程序无法正常运行或启动。这种错

电脑提示xlstat4.dll丢失怎么修复? xlstat4.dll文件丢失处理办法

《电脑提示xlstat4.dll丢失怎么修复?xlstat4.dll文件丢失处理办法》长时间使用电脑,大家多少都会遇到类似dll文件丢失的情况,不过,解决这一问题其实并不复杂,下面我们就来看看xls... 在Windows操作系统中,xlstat4.dll是一个重要的动态链接库文件,通常用于支持各种应用程序

MySQL JSON 查询中的对象与数组技巧及查询示例

《MySQLJSON查询中的对象与数组技巧及查询示例》MySQL中JSON对象和JSON数组查询的详细介绍及带有WHERE条件的查询示例,本文给大家介绍的非常详细,mysqljson查询示例相关知... 目录jsON 对象查询1. JSON_CONTAINS2. JSON_EXTRACT3. JSON_TA

SpringBoot整合Sa-Token实现RBAC权限模型的过程解析

《SpringBoot整合Sa-Token实现RBAC权限模型的过程解析》:本文主要介绍SpringBoot整合Sa-Token实现RBAC权限模型的过程解析,本文给大家介绍的非常详细,对大家的学... 目录前言一、基础概念1.1 RBAC模型核心概念1.2 Sa-Token核心功能1.3 环境准备二、表结

电脑蓝牙连不上怎么办? 5 招教你轻松修复Mac蓝牙连接问题的技巧

《电脑蓝牙连不上怎么办?5招教你轻松修复Mac蓝牙连接问题的技巧》蓝牙连接问题是一些Mac用户经常遇到的常见问题之一,在本文章中,我们将提供一些有用的提示和技巧,帮助您解决可能出现的蓝牙连接问... 蓝牙作为一种流行的无线技术,已经成为我们连接各种设备的重要工具。在 MAC 上,你可以根据自己的需求,轻松地

电脑提示Winmm.dll缺失怎么办? Winmm.dll文件丢失的多种修复技巧

《电脑提示Winmm.dll缺失怎么办?Winmm.dll文件丢失的多种修复技巧》有时电脑会出现无法启动程序,因为计算机中丢失winmm.dll的情况,其实,winmm.dll丢失是一个比较常见的问... 在大部分情况下出现我们运行或安装软件,游戏出现提示丢失某些DLL文件或OCX文件的原因可能是原始安装包

无法启动此程序因为计算机丢失api-ms-win-core-path-l1-1-0.dll修复方案

《无法启动此程序因为计算机丢失api-ms-win-core-path-l1-1-0.dll修复方案》:本文主要介绍了无法启动此程序,详细内容请阅读本文,希望能对你有所帮助... 在计算机使用过程中,我们经常会遇到一些错误提示,其中之一就是"api-ms-win-core-path-l1-1-0.dll丢失