題目大意:
給你乙個字串,求出現次數在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大的數,...