字尾陣列之求出現次數L到R次的字串的個數

2021-08-28 09:12:26 字數 1351 閱讀 8242

題目大意:

給你乙個字串,求出現次數在l到r次之間的字串的個數。

解題思路:

利用height陣列求解,首先我們要知道求l到r次的數量可以利用l次以上的數量減去r+1次以上的數量求得,那麼這個題就轉換為了求出現k次以上的字串的個數。

首先k=1 特判,即 n-sa[i]-height[i],即所有不相同子串。

k>1時,利用height陣列,對每k-1個height陣列求最小值,求出的結果記為 now ,若now>pre pre為上個k-1 heigh陣列的最小值,則ans+=now-pre 之後將pre更新為now即可

注意該題需要long long

ac**:

#include#define lson rt<<1

#define rson rt<<1|1

#define rank ra

using namespace std;

const int maxn=2e5+10;

const int inf=1e9+7;

const double pi=acos(-1.0);

typedef long long ll;

char s[maxn];

int l,r,n;

int sa[maxn],rank[maxn],height[maxn];

int t1[maxn],t2[maxn],r[maxn],c[maxn];

bool cmp(int *r,int a,int b,int l)

void da(int str,int sa,int rank,int height,int n,int m)

int k=0;

n--;

for(int i=0;i<=n;i++) rank[sa[i]]=i;

for(int i=0;i>1;

t[rt].l=l,t[rt].r=r,t[rt].mid=mid;

t[rt].val=inf;

if(l==r)

if(l<=t[rt].mid) build(l,mid,lson);

if(r>t[rt].mid) build(mid+1,r,rson);

t[rt].val=min(t[lson].val,t[rson].val);

}int query(int l,int r,int rt)

ll cal(int k) //求出現k次以上的字串的個數

int l=2,r=2+k-2;

int pre=0;

while(r<=n)

return ans;

}int main()

return 0;

}

演算法筆記之陣列 找出陣列中出現次數最多的數

法一 遍歷計數法 找出出現次數最多的數字 方法一 public static void candidate int array 找出陣列中出現次數最多的那個數 int maxcount count 0 int maxnumber 0 for int i 1 i 100 i 找出最多出現的次數 for...

C 演算法之 陣列中出現次數超過一半的數字

題目描述 陣列中有乙個數字出現的次數超過陣列長度的一半,請找出這個數字。例如輸入乙個長度為9的陣列。由於數字2在陣列中出現了5次,超過陣列長度的一半,因此輸出2。看到這個題目,我自己想到的方法 另外申請乙個陣列b,用來存放該陣列a 元素出現的次數,再遍歷b陣列,出現次數最多的就是 但是這個如果a陣列...

劍指Offer之 陣列中出現次數超過一半的數字

陣列中有乙個數字出現的次數超過陣列長度的一半,找出這個數字。1 基於partition函式的o n 的解法 找到下標為n 2的數 2 根據陣列特點找出o n 的演算法。includeusing namespace std 功能 求陣列中出現次數超過一半的數字 思路1 利用快速排序可以求出第k大的數,...