首页 > 其他分享 >ADASTRNG - Ada and Substring 题解

ADASTRNG - Ada and Substring 题解

时间:2023-10-30 09:55:21浏览次数:40  
标签:ADASTRNG 子串 字符 int 题解 Rank Substring 后缀 MAXN

ADASTRNG - Ada and Substring 题解

题目描述

给定一个小写字符串。

输出 \(26\) 个数,代表以 \(\texttt{a}\sim \texttt{z}\) 开头的本质不同的子串个数。

题目分析

高度数组模板题。

可以想到将以每个字符开头的本质不同的子串数目转化为:

  • 以每个字符开头的所有字串数目减去以每个字符开头的相同子串数目。

那么对于以每一个字符开头的后缀,它与排名比它上一位的后缀同时产生的子串个数即是它们的最长公共前缀长度,那么用高度数组去重就可以去掉重复产生的子串的个数。

那么每次发现该后缀与排名比它前一位的后缀都是以同一个字符开头时,直接将这个字符的答案减去 \(Height_i\) 即可。

(这道题不知道为什么,反正没有卡 \(O(nlog^2n)\) 的后缀数组求解。)

代码

/*
 * @Author: Ehundategh
 * @Date: 2023-10-25 18:17:02
 * @FilePath: \Code\LuieGu\ADASTRNG - Ada and Substring.cpp
 * @Description: You Steal,I kill
 */
#include <cstdio>
#include <cstring>
#include <algorithm>
#define MAXN 2000010
using namespace std;
int Sa[MAXN],Rank[MAXN],Temp[MAXN],n,k=1;
long long Ans[MAXN];
int Height[MAXN];
char In[MAXN];
bool cmpsa(int i,int j){
    if(Rank[i]!=Rank[j]) return Rank[i]<Rank[j];
    else{
        int Secondi=i+k<=n?Rank[i+k]:-1;
        int Secondj=j+k<=n?Rank[j+k]:-1;
        return Secondi<Secondj;
    }
}
void Get_Sa(){
    for(int i=1;i<=n;i++) Sa[i]=i,Rank[i]=In[i];
    for(k=1;k<=n;k*=2){
        sort(Sa+1,Sa+n+1,cmpsa);
        Temp[Sa[1]]=1;
        for(int i=1;i<=n;i++) Temp[Sa[i+1]]=Temp[Sa[i]]+(cmpsa(Sa[i],Sa[i+1])?1:0);
        for(int i=1;i<=n;i++) Rank[i]=Temp[i];
    }
}
void Get_Height(){
    Height[1]=0;
    for(int i=1,k=0;i<=n;i++){
        if(Rank[i]==1) continue;
        if(k>0)k--;
        while(In[i+k]==In[Sa[Rank[i]-1]+k]) k++;
        Height[Rank[i]]=k;
    }
}
int main(){
    scanf("%s",In+1);
    n=strlen(In+1); Get_Sa(); Get_Height();
    for(int i=1;i<=n;i++){
        Ans[In[i]-'a'+1]+=1ll*(n-i+1);
    }
    for(int i=2;i<=n;i++){
        if(In[Sa[i]]==In[Sa[i-1]]) Ans[In[Sa[i]]-'a'+1]-=1ll*(Height[i]);
    }
    for(int i=1;i<=26;i++) printf("%lld ",Ans[i]);
    return 0; 
}

标签:ADASTRNG,子串,字符,int,题解,Rank,Substring,后缀,MAXN
From: https://www.cnblogs.com/Ehundategh/p/17797107.html

相关文章

  • Luogu P4168 [Violet] 蒲公英 题解
    题目链接[Violet]蒲公英分析可以先将\(a[i]\)离散化然后考虑分块对于询问\(x,y\),\(x\)属于\(p\),\(y\)属于\(q\)当\(q-p<=1\)时直接暴力枚举即可,时间复杂度为\(O(\sqrt{n})\)\(else\)如图中间为分好块的地方我们发现,\(ans\)只可能为中间的众数或两边的......
  • 2023年10月第四周题解------输入与输出
     问题A:ly喜欢玩石头 解题思路题目告诉我们(1<=a,b<=1e9),那么int类型就够了。因为这两个数相加最大为20亿定义两个变量a和b输入a和b的值打印a加b的值#include<stdio.h>#include<string.h>#include<stdlib.h>#include<math.h>#include<time.h>intmain......
  • 题解:「NOIP2022 提高组」种花
    题解:「NOIP2022提高组」种花题目大意:给定一个\(n\timesm\)的01矩阵,0表示可以种花,1表示土坑(无法种花),现在要在图上种出一个C型或F型(C,F横着的两条线的长度都可以不同,但一定是面向右边的),现在问你种C和F分别有多少种方案(除了这个形状外不能在任何地方种花),多组数据,\(T\leq5\)。......
  • 【梦熊联盟】10月28日 NOIP十连测 第五场 题解
    目录T1男女排队简要题意:题解:T2树上最多不相交路径简要题意:题解:T3生日T4组队比赛简要题意:题解:T1男女排队简要题意:求长度为\(n\)的01序列不包含字串101或111的个数。\((n\leqslant10^{18})\)题解:一开始往容斥的思路去想,但是在推式子的时候发现其实很难容斥掉一个子串......
  • 常见问题解决 --- 安卓12关闭phantom processes killer杀后台功能
    1.adb连接成功后,执行adbdevices2.执行adbshell3.执行device_configset_sync_disabled_for_testspersistentdevice_configputactivity_managermax_phantom_processes2147483647settingsputglobalsettings_enable_monitor_phantom_procsfalse......
  • 常见问题解决 --- adb连接失败
    可能原因有,手机问题,电脑问题,线材问题。手机问题有:没有开启adb调试usb连接模式不是文件传输模式电脑问题有:adb驱动安装版本不匹配adb没有正确安装安卓驱动没有安装线材质量不好,断开 ......
  • VMware VCSA 5480 后台登录提示无法登陆问题解决
     通过控制台登入启用shell使用service-control--status--all查看applmgmt服务状态(显示已停止) 使用service-control--startapplmgmt启动服务 回车后会自动退出命令行模式 此时回到浏览器新建标签页重新登录5480端口成功    使用官网说明使用SingleS......
  • 【题解】P9753 [CSP-S 2023] 消消乐(字符串哈希,DP)
    【题解】P9753[CSP-S2023]消消乐不知道考场脑子是抽了还是有病,全程都不知道在放什么屁。特别鸣谢:@dbxxx给我讲解了解法一的满分做法,并让我对哈希有了更加深刻的认识;@Daidly给我讲解了解法二。题目链接P9753[CSP-S2023]消消乐题意概述给定一个长度为\(n\)的只含小......
  • AtCoder Beginner Contest 326 题解
    首先,\(\text{HappyBirthdaytome!}\)A-2UP3DOWN常规ABCA...//If,oneday,Ifinallymanagetomakemydreamsareality...//Iwonder,willyoustillbetherebymyside?#include<bits/stdc++.h>#defineIOSios::sync_with_stdio(false)#defineTI......
  • P2514 [HAOI2010] 工厂选址 题解
    目录DescriptionSolutionCodeDescription有\(m\)座煤矿,每一座煤矿有\(a_i\)吨煤,第\(i\)座煤矿到第\(j\)号发电厂的运费为\(c_{i,j}\)每吨。有一座发电厂(标号为0),需要恰好\(b\)吨煤矿发电,初始运行费用为\(h\)。还有\(n\)座待运行的发电厂(标号为1~n),每座发电厂初......