求給定串ll到r
r的位置裡字典序最小的字串出現的次數。
字典序最小的串,肯定是乙個字元啊。
可以用線段樹維護一下。時間複雜度o(t
qlog
n)o(
tqlo
gn)當然也可以用字首和。時間複雜度o(t
(q+n
))o(
t(q+
n))線段樹:
#include #include #include #define n 1000100
using namespace std;
int n,t,m;
char c[n];
struct node
tree[n*3];
void make(int x) //建樹
int mid=(tree[x].l+tree[x].r)/2;
tree[x*2].l=tree[x].l;
tree[x*2].r=mid;
tree[x*2+1].l=mid+1;
tree[x*2+1].r=tree[x].r;
make(x*2);
make(x*2+1);
if (tree[x*2].c==tree[x*2+1].c) //最小字元和出現次數更改
else if (tree[x*2].cmid) return find(x*2+1,l,r);
int a=find(x*2,l,mid);
int b=find(x*2+1,mid+1,r);
if (a%100b%100) return b; //取出字元和ascii碼
return (a/100+b/100)*100+a%100; //更新
}int main()
} return 0;
}
字首和:#include #include #include #define n 1000100
using namespace std;
int s[n][30],t,n,m,l,r;
char c[n];
int main()
} }return 0;
}
HDU6345 子串查詢 字首和
字首和是一種重要的預處理,能大大降低查詢的時間複雜度。字首和,差分。其實可以一起學的哈哈。文章首發 推薦這個博主寫的文章 x丶 hdu6345 度度熊的字串課堂開始了!要以像度度熊一樣的天才為目標,努力奮鬥哦!為了檢驗你是否具備不聽課的資質,度度熊準備了乙個只包含大寫英文本母的字串 a 1,n a1...
HDU 6345 子串查詢 暴力
題意是每組給定乙個字串,在有限查詢次數內輸出所要查詢區間的字典序最小的子串個數。字典序最小的子串,就是所查詢區間中字典序最小的單個字元,問題就轉化成了求一段區間內字典序最小的字元個數。開始時盲目暴力,直接用桶排序的做法一段一段去求,果然t了 這種就不貼 了 然後想到先掃一遍,求出從字串首位到第 i ...
hdu2345 子串查詢 字首和預處理
度度熊的字串課堂開始了!要以像度度熊一樣的天才為目標,努力奮鬥哦!為了檢驗你是否具備不聽課的資質,度度熊準備了乙個只包含大寫英文本母的字串 a 1,n a1a2 ana 1,n a1a2 an,接下來他會向你提出 qq 個問題 l,r l,r 你需要回答字串 a l,r alal 1 ara l,r...