幫彩票網(wǎng)站做流量提升seo賺錢方式
采用存儲目標字符下標的方法,此題的想法比較新奇,故予以記錄。
存好下標之后,可以先定位好啟始的字符,然后去搜結(jié)尾字符符合長度k并且最靠近啟始字符的下標,找到之后可以直接取到這個下標之后的所有下標,因為都滿足了長度大于等于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的下標,a2存是字符c2的下標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對應(yīng)的下標int t = a1[i]; //先取出c1對應(yīng)下標int c = t + k - 1; //定義出滿足和c1距離k的下標//二分,從0二分到存c2下標的數(shù)組的長度int l = 0, r = a2.size() - 1; while (l < r) {int mid = l + r >> 1;if (a2[mid] >= c)r = mid; //如果當前c2的下標是大于等于最近的位置,就去搜更小的else l = mid + 1;}//這里直接取a2的長度減去l,l在這里代表的是a2的下標//通過上面的二分,l已經(jīng)是最靠近c1的了,所以這就是能夠取到的最長的長度了if (a2[l] >= c)res += a2.size() - l;}cout << res;return 0;
}