NC244123. 子串的子序列
描述
输入描述
一行一个字符串代表 。
保证:
字符串 的长度不超过仅由小写字母组成
输出描述
一行一个整数代表答案。
示例1
输入:
acaacb
输出:
6
说明:
共有六个区间中包含偶数个 "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); }