首页 > 其他分享 >acwing 140. 后缀数组

acwing 140. 后缀数组

时间:2022-12-01 19:24:46浏览次数:52  
标签:140 后缀 pow ll int 数组 include acwing

把字符串S的所有后缀按照字典序排列,排名为 i 的后缀记为SA[ i ]

 

额外地,我们考虑排名为 i 的后缀与排名为  i-1 的后缀,把二者的最长公共前缀的长度记为 hgt[i]

使用快排、Hash 与二分 求出 两个数组

 

#include<iostream>
#include <algorithm>
#include <cstring>
using namespace std;
 #define ll unsigned long long
  const int N=1e6+5;
  
 char s[N];
 int id[N],n;
 ll h[N],pow[N];
 ll bas=131;
 
 ll f1(int l,int r){
     return h[r]-h[l-1]*pow[r-l+1];
 }
 int find(int a,int b){
     int l=0,r=n-max(a,b)+1; int t=0;
         while(l<=r){
             int md=(l+r)/2;
             if(f1(a,a+md-1)==f1(b,b+md-1)) 
             l=md+1,t=md;
             else r=md-1;
         }
         return t;
 }
 int cmp(int i,int j){
     int k=find(i,j);
     int t1,t2;
     if(i+k<=n) t1=s[i+k]; else t1=-1e9;
     if(j+k<=n) t2=s[j+k]; else t2=-1e9;
     
     return t1<t2;
 }
 void sov(){
     h[0]=0; 
     int i,ans=0;
     n=strlen(s+1); 
     for(i=1;i<=n;i++){
         h[i]=h[i-1]*bas+s[i];
         id[i]=i;
     }
     sort(id+1,id+1+n,cmp);
     for(i=1;i<=n;i++) cout<<id[i]-1<<' ';
     cout<<endl<<0;
     for(i=2;i<=n;i++) cout<<' '<<find(id[i],id[i-1]);
     cout<<endl;
 }
 main(){
     int i;
     pow[0]=1;
     for(i=1;i<=1e6;i++) pow[i]=pow[i-1]*bas;
     cin>>s+1;
     sov();
 }

 

标签:140,后缀,pow,ll,int,数组,include,acwing
From: https://www.cnblogs.com/towboa/p/16942419.html

相关文章

  • error: rpmdb: BDB0113 Thread/process 14536/140712790841152 failed: BDB1507 Threa
    yumremovedockererror:rpmdb:BDB0113Thread/process14536/140712790841152failed:BDB1507ThreaddiedinBerkeleyDBlibraryerror:db5error(-30973)fromdb......
  • 2022-12-01 Acwing每日一题
    本系列所有题目均为Acwing课的内容,发表博客既是为了学习总结,加深自己的印象,同时也是为了以后回过头来看时,不会感叹虚度光阴罢了,因此如果出现错误,欢迎大家能够指出错误,我......
  • 后缀数组&后缀自动机
    SA后缀排序的中心思想是倍增,为了优化常数会使用一些比较特别的技巧。写法上主要分为两个部分,即预处理部分和倍增部分。首先定义几个数组,\(sa_i\)是排名为\(i\)的数组的......
  • acwing131. 直方图中最大的矩形
     #include"bits/stdc++.h"usingnamespacestd;constintN=1e5+3;#defineintlonglongintn,a[N];inthh,stk[N],w[N];voidsov(){hh=0;m......
  • 后缀数组(SA)学习笔记
    这玩意真的是给喵人学的吗,谁告诉本喵这个简单让我先学这个的(哭sa[sum[rk[tp[i]]]--]=tp[i];有没有人浇浇这句话什么意思啊(悲tp[i]表示第二关键字排名为i的串的位置r......
  • nginx 同一个域名根据后缀不同访问不同的项目
    server{listen80;server_namebcgx.work; location/{ indexlogin.htmllogin.htmindex.php;root/www/server/front; } loca......
  • 数据结构实验之栈与队列二:一般算术表达式转换成后缀式 sdut-oj
    #include<stdio.h>#include<stdlib.h>#defineSTACK_INIT_SIZE100#defineSTACKINCREMENT100typedefstruct{  char*base;  ......
  • AcWing 111. 畜栏预定
    有n头牛在畜栏中吃草。每个畜栏在同一时间段只能提供给一头牛吃草,所以可能会需要多个畜栏。给定n头牛和每头牛开始吃草的时间A以及结束吃草的时间当两头牛的吃草区......
  • AcWing 第79场周赛
    周赛链接:https://www.acwing.com/activity/content/competition/problem_list/2644/AcWing4722.数列元素#include<iostream>usingnamespacestd;intn;intmain(......
  • acwing 110. 防晒
     贪心:按照a[i].y递减排序,对每个牛取所有物品的值最大的#include<bits/stdc++.h>usingnamespacestd;constintN=2504;structT{intx,y;}a[N];......