子串简写(枚举+前缀和)

 (学习自用,代码来自蓝桥杯网站)

子串简写(枚举+前缀和)_第1张图片

笨办法(大概)

#include 
using namespace std;
const int N=1e6+7;
long long temp;
long long ft,rg;
long long lef[N],righ[N];
int main() {
	string s;
	char c1,c2;
	long long n;
	long long ans;
	cin>>n;
	cin>>s>>c1>>c2;
	for(long long i=0;i=n) {
				ans+=rg-j;
				//j-i符合字符数要求,那后面的所有j都符合 
				//因为后面的下标更大,所以用右边符合字母的总数减去当前字母下标;
				temp=j; 
				break;
			}
		}
	} 
	cout<

前缀和

#include
using namespace std;
int n,l,c[500005];
long long sum;
char s[500005],a,b;
int main(){
  scanf ("%d\n%s %c %c",&n,s+1,&a,&b);
  l=strlen(s+1);
  for(int i=1;i<=l;i++){
    if (s[i]==a) c[i]++;
    c[i]+=c[i-1];//到i位置有几个首字母a 
    if (i>=n&&s[i]==b){
      sum+=c[i-n+1];//截至到i-n+1这个位置前有几个a就有几个子串 
	  //a b a b a b d b  n=4 c1=a c2=b;
	  //1 2 3 4 5 6 7 8 
	  //第一个符合条件(i>=n)b的位置是 4 i=4 c[4-4+1]=c[1]有一个a
	  //第二个符合条件 		b 的位置是  6 i=6 c[6-4+1]=c[3]有两个a
	  //第三个符合条件		b 的位置是  8 i=8 c[8-4+1]=c[5]有三个a
	  //1+2+3=6 
    }
  }
  cout<

你可能感兴趣的:(算法,c++,数据结构)