string string string HDU - 6194 (后缀数组+lcp+RMQ)

3 篇文章 0 订阅
2 篇文章 0 订阅

题目链接:https://cn.vjudge.net/problem/HDU-6194

题意:给你一个字符串,让你求出恰好出现k次的子串的个数

思路,后缀数组求出sa数组,lcp求出lcp数组,RMQ来查询(线段树也可以) 

查找的是  按照k的大小为一个区间长度来查询[i, i+k-1],然后还需要减去 至少出现k+1次的子串[i-1, i+k-1] 和[i,i+k],还得加上

[i-1, i+k] 最后注意一下边界就行了

 

 

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <queue>
#include <vector>
using namespace std;
#define ll long long
#define pb push_back
#define mk make_pair
#define INF 0x3f3f3f3f
const int maxn = 1e5 + 5;

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 Rank[],int lcp[],int n,int m) {
    ++n;
    int i,j,p,*x = t1,*y = t2;
    for(i=0;i<m;i++) c[i] = 0;
    for(i=0;i<n;i++) c[x[i] = str[i] ]++;
    for(i=1;i<m;i++) c[i] += c[i-1];
    for(i=n-1;i>=0;i--) sa[--c[x[i]]]=i;
    for(j=1;j<=n;j<<=1) {
        p=0;
        for(i=n-j;i<n;i++)y[p++]=i;
        for(i=0;i<n;i++) if(sa[i]>=j) y[p++] = sa[i]-j;
        for(i=0;i<m;i++) c[i]=0;
        for(i=0;i<n;i++) c[x[y[i]]]++;
        for(i=1;i<m;i++)c[i]+=c[i-1];
        for(i=n-1;i>=0;i--)sa[--c[x[y[i]]]] = y[i];
        swap(x,y);
        p = 1;
        x[sa[0]] = 0;
        for(i=1;i<n;i++) {
            x[sa[i] ] = cmp(y,sa[i-1],sa[i],j) ? p-1:p++;
        }
        if(p>=n)break;
        m=p;
    }
    int k = 0;
    n--;
    for(i=0;i<=n;i++) Rank[sa[i]]=i;
    for(i=0;i<n;i++) {
        if(k)--k;
        j = sa[Rank[i]-1];
        while(str[i+k] == str[j+k]) ++k;
        lcp[Rank[i]] = k;
    }
}

int lcp[maxn],a[maxn],sa[maxn],Rank[maxn];

char s[maxn];

int d[maxn][40];
int len;

void rmq_init(int *A, int n) {
    for(int i=0;i<n;i++) d[i][0]=A[i];
    for(int j=1;(1<<j) <=n;j++) {
        for(int i=0;(i+(1<<j)-1) <n;i++) {
            d[i][j] = min(d[i][j-1],d[i+(1<<(j-1))][j-1]);
        }
    }
}

int ASK(int l,int r) {
    int k=0;
    while((1<<(k+1)) <= r-l+1) ++k;
    return min(d[l][k],d[r-(1<<k)+1][k] ) ;
}

int ask(int l,int r) {
    if(l==r) return len-sa[r];
    return ASK(l+1,r);
}

int main(){
    int T;
    scanf("%d",&T);
    while(T--) {
        int k;
        scanf("%d",&k);
        scanf("%s",s);
        len = strlen(s);
        for(int i=0;i<len;i++) {
            a[i] = s[i] - 'a' +1;
        }
        a[len] = 0;
        da(a,sa,Rank,lcp,len,27);
        rmq_init(lcp,len+1);
        ll ans =0;
        for(int i=1;i+k-1<=len;i++) {
            ans+=ask(i,i+k-1);
            if(i-1>0)ans-=ask(i-1,i+k-1);
            if(i+k<=len) ans-=ask(i,i+k);
            if(i-1>0 && i+k <=len) ans+=ask(i-1,i+k);
        }
        printf("%lld\n",ans);
    }


     return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
基于Django+python编写开发的毕业生就业管理系统支持学生教师角色+db数据库(毕业设计新项目).zip 【备注】 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用!有问题请及时沟通交流。 2、适用人群:计算机相关专业(如计科、信息安全、数据科学与大数据技术、人工智能、通信、物联网、自动化、电子信息等)在校学生、专业老师或者企业员工下载使用。 3、用途:项目具有较高的学习借鉴价值,不仅适用于小白学习入门进阶。也可作为毕设项目、课程设计、大作业、初期项目立项演示等。 4、如果基础还行,或热爱钻研,亦可在此项目代码基础上进行修改添加,实现其他不同功能。 欢迎下载!欢迎交流学习!不清楚的可以私信问我! 基于Django+python编写开发的毕业生就业管理系统支持学生教师角色+db数据库(毕业设计新项目).zip基于Django+python编写开发的毕业生就业管理系统支持学生教师角色+db数据库(毕业设计新项目).zip基于Django+python编写开发的毕业生就业管理系统支持学生教师角色+db数据库(毕业设计新项目).zip基于Django+python编写开发的毕业生就业管理系统支持学生教师角色+db数据库(毕业设计新项目).zip基于Django+python编写开发的毕业生就业管理系统支持学生教师角色+db数据库(毕业设计新项目).zip基于Django+python编写开发的毕业生就业管理系统支持学生教师角色+db数据库(毕业设计新项目).zip基于Django+python编写开发的毕业生就业管理系统支持学生教师角色+db数据库(毕业设计新项目).zip基于Django+python编写开发的毕业生就业管理系统支持学生教师角色+db数据库(毕业设计新项目).zip基于Django+python编写开发的毕业生就业管理系统支持学生教师角色+db数据库(毕业设计新项目).zip
毕设新项目基于python3.7+django+sqlite开发的学生就业管理系统源码+使用说明(含vue前端源码).zip 【备注】 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用!有问题请及时沟通交流。 2、适用人群:计算机相关专业(如计科、信息安全、数据科学与大数据技术、人工智能、通信、物联网、自动化、电子信息等)在校学生、专业老师或者企业员工下载使用。 3、用途:项目具有较高的学习借鉴价值,不仅适用于小白学习入门进阶。也可作为毕设项目、课程设计、大作业、初期项目立项演示等。 4、如果基础还行,或热爱钻研,亦可在此项目代码基础上进行修改添加,实现其他不同功能。 欢迎下载!欢迎交流学习!不清楚的可以私信问我! 学生就业管理系统(前端) ## 项目开发环境 - IDE: vscode - node版本: v12.14.1 - npm版本: 6.13.4 - vue版本: @vue/cli 4.1.2 - 操作系统: UOS 20 ## 1.进入项目目录安装依赖 ``` npm install ``` ## 2.命令行执行进入UI界面进行项目管理 ``` vue ui ``` ## 3.编译发布包(请注意编译后存储路径) #### PS:需要将编译后的包复制到后端项目的根目录下并命名为'static' 学生就业管理系统(后端) ## 1.项目开发环境 - IDE: vscode - Django版本: 3.0.3 - Python版本: python3.7.3 - 数据库 : sqlite3(测试专用) - 操作系统 : UOS 20 ## 2.csdn下载本项目并生成/安装依赖 ``` pip freeze > requirements.txt pip install -r requirements.txt ``` ## 3.项目MySQL数据库链接错误 [点击查看解决方法](https://www.cnblogs.com/izbw/p/11279237.html)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值