测评会员优惠活动进行中 · 开通 VIP,有效期内测评不限次 VIP 优惠中 · 测评不限次 立即查看

A23494. ABC字符串小Y给了小X一个长度为n的只包含大写字母A,B,C的字符串。你可以对这个字符串进行如下操作:将子串ABC变成BCA。小X想知道这个字符串最多能进行多少次操作。一个字符串的子串是把这个字符串通过删去头部和尾部若干个字符形成的字符串。例如:A, B, BB, AB, ABB 是 ABB 的子串,ABA 不是 ABBA 的子串。输入一行一个长度为n的字符串S。输出一行一个整数表示答案。样例…

填空题 较易

题目描述

ABC字符串

小Y给了小X一个长度为n的只包含大写字母A,B,C的字符串。你可以对这个字符串进行如下操作:将子串ABC变成BCA。

小X想知道这个字符串最多能进行多少次操作。

一个字符串的子串是把这个字符串通过删去头部和尾部若干个字符形成的字符串。

例如:A, B, BB, AB, ABB 是 ABB 的子串,ABA 不是 ABBA 的子串。

输入

一行一个长度为n的字符串S。

输出

一行一个整数表示答案。

样例输入1

ABCABC

样例输入2

ABCACCBABCBCCAACBC

样例输出1

3

样例输出2

6

提示

样例解释1

ABCABC
ABCB CA
BCABCA
BCBCAA
最多操作3次。

数据范围

对于全部测试点:n<=200000。

对于测试点1-4:n<=10

对于测试点5-7:n<=1000,并且保证无论按照什么顺序操作,被操作的子串两两不相交(换句话说,一个下标不会被两个被操作的字符串同时覆盖)

对于测试点8-10:n<=200000

参考答案

#include <iostream> #include <string> using namespace std; int main() { string s; cin >> s; int count = 0; int i = 0; int n = s.size(); while (i <= n - 3) { if (s.substr(i, 3) == "ABC") { count++; // 替换为BCA(即交换i和i+1位置的字符) swap(s[i], s[i+1]); // 回溯检查前面是否形成新的ABC if (i > 0) i--; else i++; // 无法回溯则前进 } else { i++; } } cout << count << endl; return 0; }
上一题 下一题