列表

详情


NC244123. 子串的子序列

描述

牛牛获得了一个仅由小写字母构成的字符串 s

他想知道这个字符串中有多少个子区间满足:区间中含有子序列 "ac" ,且区间中包含的 "ac" 子序列为偶数个。

请你输出满足上述条件的子区间的个数。

输入描述

一行一个字符串代表 s
保证:
字符串 s 的长度不超过  

s 仅由小写字母组成

输出描述

一行一个整数代表答案。

示例1

输入:

acaacb

输出:

6

说明:

共有六个区间中包含偶数个 "ac" 子序列:
    1、区间 [1,5] 包含 4 个 "ac" 子序列
    2、区间 [1,6] 包含 4 个 "ac" 子序列
    3、区间 [2,5] 包含 2 个 "ac" 子序列
    4、区间 [2,6] 包含 2 个 "ac" 子序列
    5、区间 [3,5] 包含 2 个 "ac" 子序列
    6、区间 [3,6] 包含 2 个 "ac" 子序列

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++(g++ 7.5.0) 解法, 执行用时: 8ms, 内存消耗: 916K, 提交时间: 2022-11-25 21:10:11

#include<bits/stdc++.h>
#define j1 fuck1
using namespace std;
const int N=5e5+10;

char s[N];
int n,j1,o1,j2,o2,lst;
int h1,h2;

long long ans;

int main(){
    scanf("%s",s+1); n=strlen(s+1);
    for(int i=1;i<=n;i++){
        if(s[i]=='a'){
            swap(o1,o2),swap(j1,j2);
            swap(h1,h2);
            h1+=i-lst; lst=i;
        }
        if(s[i]=='c'){
            swap(j1,o1);
            j1+=h1,o2+=h2;
            h1=h2=0;
        }
        ans+=o1+o2;
//     printf("%d %d %d %d  Ans: %d\n",j1,o1,j2,o2,ans);
    }
    printf("%lld\n",ans);
    return 0;
}

C++(clang++ 11.0.1) 解法, 执行用时: 9ms, 内存消耗: 924K, 提交时间: 2022-12-01 12:53:42

#include <iostream>
using namespace std;

const int N = 5e5 + 5;
char s[N];
long long res, r1, r2, r3, r4, r5, r6, r7;

int main()
{
	scanf("%s", s);
	for (int i = 0; s[i]; i++)
	{
		if (s[i] == 'a')
		{
			swap(r1, r2);
			swap(r3, r4);
			swap(r5, r6);
			r5 += r7 + 1;
			r7 = 0;
		}
		else if (s[i] == 'c')
		{
			swap(r1, r3);
			r1 += r5;
			r4 += r6;
			r5 = r6 = 0;
			r7++;
		}
		else
			r7++;
		res += r3 + r4;
	}
	printf("%lld\n", res);
}

上一题