幫彩票網(wǎng)站做流量提升seo賺錢方式
采用存儲(chǔ)目標(biāo)字符下標(biāo)的方法,此題的想法比較新奇,故予以記錄。
存好下標(biāo)之后,可以先定位好啟始的字符,然后去搜結(jié)尾字符符合長(zhǎng)度k并且最靠近啟始字符的下標(biāo),找到之后可以直接取到這個(gè)下標(biāo)之后的所有下標(biāo),因?yàn)槎紳M足了長(zhǎng)度大于等于k。
代碼:
#include<iostream>
#include<vector>
using namespace std;
const int N = 5e5 + 10;int main() {//讀入int k; cin >> k;string str; cin >> str;char c1, c2; cin >> c1 >> c2;//a1存是字符c1的下標(biāo),a2存是字符c2的下標(biāo)vector<int>a1;vector<int>a2;//存for (int i = 0; i < str.length(); i++) {if (str[i] == c1)a1.push_back(i);if (str[i] == c2)a2.push_back(i);}long long res = 0;//開longlong存答案for (int i = 0; i < a1.size(); i++) {//掃所有的c1對(duì)應(yīng)的下標(biāo)int t = a1[i]; //先取出c1對(duì)應(yīng)下標(biāo)int c = t + k - 1; //定義出滿足和c1距離k的下標(biāo)//二分,從0二分到存c2下標(biāo)的數(shù)組的長(zhǎng)度int l = 0, r = a2.size() - 1; while (l < r) {int mid = l + r >> 1;if (a2[mid] >= c)r = mid; //如果當(dāng)前c2的下標(biāo)是大于等于最近的位置,就去搜更小的else l = mid + 1;}//這里直接取a2的長(zhǎng)度減去l,l在這里代表的是a2的下標(biāo)//通過(guò)上面的二分,l已經(jīng)是最靠近c(diǎn)1的了,所以這就是能夠取到的最長(zhǎng)的長(zhǎng)度了if (a2[l] >= c)res += a2.size() - l;}cout << res;return 0;
}