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

相关文章

JavaScript对象转数组的三种方法实现

《JavaScript对象转数组的三种方法实现》本文介绍了在JavaScript中将对象转换为数组的三种实用方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友... 目录方法1:使用Object.keys()和Array.map()方法2:使用Object.entr

使用Java填充Word模板的操作指南

《使用Java填充Word模板的操作指南》本文介绍了Java填充Word模板的实现方法,包括文本、列表和复选框的填充,首先通过Word域功能设置模板变量,然后使用poi-tl、aspose-words... 目录前言一、设置word模板普通字段列表字段复选框二、代码1. 引入POM2. 模板放入项目3.代码

Python进行word模板内容替换的实现示例

《Python进行word模板内容替换的实现示例》本文介绍了使用Python自动化处理Word模板文档的常用方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友... 目录技术背景与需求场景核心工具库介绍1.获取你的word模板内容2.正常文本内容的替换3.表格内容的

JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法

《JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法》:本文主要介绍JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法,每种方法结合实例代码给大家介绍的非常... 目录引言:为什么"相等"判断如此重要?方法1:使用some()+includes()(适合小数组)方法2

修复已被利用的高危漏洞! macOS Sequoia 15.6.1发布

《修复已被利用的高危漏洞!macOSSequoia15.6.1发布》苹果公司于今日发布了macOSSequoia15.6.1更新,这是去年9月推出的macOSSequoia操作... MACOS Sequoia 15.6.1 正式发布!此次更新修复了一个已被黑客利用的严重安全漏洞,并解决了部分中文用户反馈的

Java中数组与栈和堆之间的关系说明

《Java中数组与栈和堆之间的关系说明》文章讲解了Java数组的初始化方式、内存存储机制、引用传递特性及遍历、排序、拷贝技巧,强调引用数据类型方法调用时形参可能修改实参,但需注意引用指向单一对象的特性... 目录Java中数组与栈和堆的关系遍历数组接下来是一些编程小技巧总结Java中数组与栈和堆的关系关于

电脑提示d3dx11_43.dll缺失怎么办? DLL文件丢失的多种修复教程

《电脑提示d3dx11_43.dll缺失怎么办?DLL文件丢失的多种修复教程》在使用电脑玩游戏或运行某些图形处理软件时,有时会遇到系统提示“d3dx11_43.dll缺失”的错误,下面我们就来分享超... 在计算机使用过程中,我们可能会遇到一些错误提示,其中之一就是缺失某个dll文件。其中,d3dx11_4

游戏闪退弹窗提示找不到storm.dll文件怎么办? Stormdll文件损坏修复技巧

《游戏闪退弹窗提示找不到storm.dll文件怎么办?Stormdll文件损坏修复技巧》DLL文件丢失或损坏会导致软件无法正常运行,例如我们在电脑上运行软件或游戏时会得到以下提示:storm.dll... 很多玩家在打开游戏时,突然弹出“找不到storm.dll文件”的提示框,随后游戏直接闪退,这通常是由于

SpringBoot集成EasyPoi实现Excel模板导出成PDF文件

《SpringBoot集成EasyPoi实现Excel模板导出成PDF文件》在日常工作中,我们经常需要将数据导出成Excel表格或PDF文件,本文将介绍如何在SpringBoot项目中集成EasyPo... 目录前言摘要简介源代码解析应用场景案例优缺点分析类代码方法介绍测试用例小结前言在日常工作中,我们经

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

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