problem description
度度熊的字串課堂開始了!要以像度度熊一樣的天才為目標,努力奮鬥哦!
為了檢驗你是否具備不聽課的資質,度度熊準備了乙個只包含大寫英文本母的字串 a[1,n] = a_1 a_2 \cdots a_na[1,n]=a1a2⋯an,接下來他會向你提出 qq 個問題 (l,r)(l,r),你需要回答字串 a[l,r] = a_l a_ \cdots a_ra[l,r]=alal+1⋯ar 內有多少個非空子串是 a[l,r]a[l,r] 的所有非空子串中字典序最小的。這裡的非空子串是字串中由至少乙個位置連續的字元組成的子串行,兩個子串是不同的當且僅當這兩個子串內容不完全相同或者出現在不同的位置。
記 |s|∣s∣ 為字串 ss 的長度,對於兩個字串 ss 和 tt ,定義 ss 的字典序比 tt 小,當且僅當存在非負整數 k(\leq \min(|s|,|t|))k(≤min(∣s∣,∣t∣)) 使得 ss 的前 kk 個字元與 tt 的前 kk 個字元對應相同,並且要麼滿足 |s| = k∣s∣=k 且 |t| > k∣t∣>k,要麼滿足 k < \min(|s|,|t|)kinput
第一行包含乙個整數 tt,表示有 tt 組測試資料。
接下來依次描述 tt 組測試資料。對於每組測試資料:
第一行包含兩個整數 nn 和 qq,表示字串的長度以及詢問的次數。
第二行包含乙個長為 nn 的只包含大寫英文本母的字串 a[1,n]a[1,n]。
接下來 qq 行,每行包含兩個整數 l_i,r_ili,ri,表示第 ii 次詢問的引數。
保證 1 \leq t \leq 101≤t≤10,1 \leq n,q \leq 10^51≤n,q≤105,1 \leq l_i \leq r_i \leq 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
分析:因為要子串字典序最小,故只要算出每乙個區間最小的字母的個數就是答案,故使用離線的莫隊演算法即可。
ac**:
#includeusing namespace std;
typedef long long ll;
const int maxn = 100000+100;
const int mod = 1000000000+7;
int a[maxn], be[maxn];
int t, n, q, len;
char str[maxn];
int ans[maxn];
int num[30];
struct nodep[maxn];
bool cmp(node a, node b)
}if(r>p[i].r)
}if(p[i].l>l)}}
printf("case #%d:\n", case++);
for(ll i=0; i/*99
5 5aaaaa
1 11 3
2 53 5
2 42 3
ab1 1
1 22 2
*/
百度之星2018資格賽1002題解
據說資格賽水過一道題就行。就寫那個簽到題吧。orz 題目糊上,度度熊的字串課堂開始了!要以像度度熊一樣的天才為目標,努力奮鬥哦!為了檢驗你是否具備不聽課的資質,度度熊準備了乙個只包含大寫英文本母的字串 a 1,n a1a2 ana 1,n a 1 a 2 a n 接下來他會向你提出 qq 個問題 l...
2015百度之星資格賽1002
problem description 列變位法是古典密碼演算法中變位加密的一種方法,具體過程如下 將明文本元分割成個數固定的分組 如5個一組,5即為金鑰 按一組一行的次序整齊排列,最後不足一組不放置任何字元,完成後按列讀取即成密文。比如 原文 123456789 金鑰 4 變換後的矩陣 1234 ...
2015百度之星資格賽1002
題目名稱 列變位法解密 problem description 列變位法是古典密碼演算法中變位加密的一種方法,具體過程如下 將明文本元分割成個數固定的分組 如5個一組,5即為金鑰 按一組一行的次序整齊排列,最後不足一組不放置任何字元 完成後按列讀取即成密文。比如 原文 123456789 金鑰 4 ...