返回题解分享
讨论 / 题解分享/ 帖子详情

子串简写(编程题) - 题解

浅浅一个二分优化

#include<bits/stdc++.h>
using namespace std;
long long k,a[5000005],b[5000005],ca,cb,ans;
string st;
char c1,c2;
int ef(int x)
{
	int l=1,r=cb,mid,ann;
	while(l<=r)
	{
		mid=(l+r)/2;
		if(b[mid]-x+1>=k)
		{
			ann=mid;
			r=mid-1;
		}
		else l=mid+1;
	}
	if(b[ann]-x+1<k)return -1;
	else return ann;
}
int main()
{
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
    cin>>k;
    cin>>st>>c1>>c2;
    for(int i=0;i<st.size();i++)
    {
    	if(st[i]==c1)
    	{
    		ca++;
			a[ca]=i+1; 
		}
		if(st[i]==c2)
		{
			cb++;
			b[cb]=i+1;
		}
	}
	for(int i=1;i<=ca;i++)
	{
		int wz=ef(a[i]);
		if(wz==-1)continue;
		else 
		{
			ans+=cb-wz+1;
		}	
	}
	cout<<ans;
}
0 回复 0 转发 2 喜欢 1 阅读
回复 (0)
默认 最新
暂无回复,快来抢沙发!