hdu2345 子串查詢 字首和預處理

2021-08-22 16:25:59 字數 1381 閱讀 6425

度度熊的字串課堂開始了!要以像度度熊一樣的天才為目標,努力奮鬥哦! 

為了檢驗你是否具備不聽課的資質,度度熊準備了乙個只包含大寫英文本母的字串 a[1,n]=a1a2⋯ana[1,n]=a1a2⋯an,接下來他會向你提出 qq 個問題 (l,r)(l,r),你需要回答字串 a[l,r]=alal+1⋯ara[l,r]=alal+1⋯ar 內有多少個非空子串是 a[l,r]a[l,r] 的所有非空子串中字典序最小的。這裡的非空子串是字串中由至少乙個位置連續的字元組成的子串行,兩個子串是不同的當且僅當這兩個子串內容不完全相同或者出現在不同的位置。 

記 |s||s| 為字串 ss 的長度,對於兩個字串 ss 和 tt ,定義 ss 的字典序比 tt 小,當且僅當存在非負整數 k(≤min(|s|,|t|))k(≤min(|s|,|t|)) 使得 ss 的前 kk 個字元與 tt 的前 kk 個字元對應相同,並且要麼滿足 |s|=k|s|=k 且 |t|>k|t|>k,要麼滿足 kinput

第一行包含乙個整數 tt,表示有 tt 組測試資料。 

接下來依次描述 tt 組測試資料。對於每組測試資料: 

第一行包含兩個整數 nn 和 qq,表示字串的長度以及詢問的次數。 

第二行包含乙個長為 nn 的只包含大寫英文本母的字串 a[1,n]a[1,n]。 

接下來 qq 行,每行包含兩個整數 li,rili,ri,表示第 ii 次詢問的引數。 

保證 1≤t≤101≤t≤10,1≤n,q≤1051≤n,q≤105,1≤li≤ri≤n1≤li≤ri≤n。

output

對於每組測試資料,先輸出一行資訊 "case #x:"(不含引號),其中 x 表示這是第 xx 組測試資料,接下來 qq 行,每行包含乙個整數,表示字串 a[l,r]a[l,r] 中字典序最小的子串個數,行末不要有多餘空格。

sample input

1

2 3ab

1 11 2

2 2

sample output

case #1:11

1

思路:

由於資料及詢問次數的位數過大,暴力肯定是不行的,是故使用字首和預處理,dp[ i ][ j ]表示第i + 1個字母截止到位置j時的出現次數

**:

#include#include#includeusing namespace std;

const int maxn = (int)1e5 + 10;

char str[maxn];

int dp[30][maxn];

int main()

}for (int i = 0;i < m;i ++)

}} }

return 0;

}

HDU6345 子串查詢 字首和

字首和是一種重要的預處理,能大大降低查詢的時間複雜度。字首和,差分。其實可以一起學的哈哈。文章首發 推薦這個博主寫的文章 x丶 hdu6345 度度熊的字串課堂開始了!要以像度度熊一樣的天才為目標,努力奮鬥哦!為了檢驗你是否具備不聽課的資質,度度熊準備了乙個只包含大寫英文本母的字串 a 1,n a1...

HDU6345 子串查詢 字首和 線段樹

求給定串ll到r r的位置裡字典序最小的字串出現的次數。字典序最小的串,肯定是乙個字元啊。可以用線段樹維護一下。時間複雜度o t qlog n o tqlo gn 當然也可以用字首和。時間複雜度o t q n o t q n 線段樹 include include include define n ...

HDU 6345 子串查詢 暴力

題意是每組給定乙個字串,在有限查詢次數內輸出所要查詢區間的字典序最小的子串個數。字典序最小的子串,就是所查詢區間中字典序最小的單個字元,問題就轉化成了求一段區間內字典序最小的字元個數。開始時盲目暴力,直接用桶排序的做法一段一段去求,果然t了 這種就不貼 了 然後想到先掃一遍,求出從字串首位到第 i ...