HDU 6345 子串查詢 暴力

2022-05-09 19:25:23 字數 1417 閱讀 2721

題意是每組給定乙個字串,在有限查詢次數內輸出所要查詢區間的字典序最小的子串個數。

字典序最小的子串,就是所查詢區間中字典序最小的單個字元,問題就轉化成了求一段區間內字典序最小的字元個數。

開始時盲目暴力,直接用桶排序的做法一段一段去求,果然t了(這種就不貼**了)......

然後想到先掃一遍,求出從字串首位到第 i 位的最小字元數,再用乙個陣列存第 0 位到第 i 位的最小字元,比較第 i 位的字元和前 i - 1 位的最小字元,第 i 位更小的話就更新最小字元和最小字元數......這樣掃一遍後,問到哪個區間就比較區間左右端點的最小字元。若左側較大,則直接輸出右側最小字元數;若兩側相等,則輸出右側的最小字元數減去左側的最小字元數;左側不可能小於右側。

但是,這種想法有較大漏洞,不能說漏洞,這就是錯誤的想法,因為這樣所記錄的最小的字元未必會出現在所求區間內......

作為對自己的警示,把這種錯誤的東西掛出來侮辱下自己......

1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #include 9

using

namespace

std;

10int num[100006

];11

char alp[100006

];12

intmain()

1333

else

if(s[i] == alp[i-1

])34

38else

3943}44

while(m--)

4554

if(alp[r]

55 cout << num[r] <

56else

if(alp[r] ==alp[l])

5766}67

}68return0;

69 }

view code

接著又想到可否將最小字元出現的位置記錄下來,然後發現完全是在自己哄自己開心......

借助wjy的力量,用二維陣列記錄位置的似桶排序的做法完成了題目,路還很長......

1 #include 2 #include 3

using

namespace

std;

4int rc[100100][26];5

intmain()615

for(int c=1;c<=t;c++)

1626 rc[i+1][s[i]-'

a']++;27}

28for(i=0;i)

2936 cout << ans <

38}39return0;

40 }

view code

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 ...

演算法23 暴力子字串查詢

各位讀者,早上好。這裡介紹下子字串查詢最初發展的思想 暴力查詢 本部落格 示例均來自 演算法 algorithmes forth edition 美 robert sedgewick kevin wayne 著 謝路雲譯 package com.cmh.algorithm.str 暴力子字串查詢 a...