徐州网站制作哪家好,市场营销推广策略,2022年5月国内重大新闻,百度后台管理采用存储目标字符下标的方法#xff0c;此题的想法比较新奇#xff0c;故予以记录。
存好下标之后#xff0c;可以先定位好启始的字符#xff0c;然后去搜结尾字符符合长度k并且最靠近启始字符的下标#xff0c;找到之后可以直接取到这个下标之后的所有下标#xff0c;因… 采用存储目标字符下标的方法此题的想法比较新奇故予以记录。
存好下标之后可以先定位好启始的字符然后去搜结尾字符符合长度k并且最靠近启始字符的下标找到之后可以直接取到这个下标之后的所有下标因为都满足了长度大于等于k。
代码
#includeiostream
#includevector
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的下标vectorinta1;vectorinta2;//存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对应的下标int t a1[i]; //先取出c1对应下标int c t k - 1; //定义出满足和c1距离k的下标//二分从0二分到存c2下标的数组的长度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的长度减去ll在这里代表的是a2的下标//通过上面的二分l已经是最靠近c1的了所以这就是能够取到的最长的长度了if (a2[l] c)res a2.size() - l;}cout res;return 0;
}