解题思路

  1. 遍历字符串的每个字符,如果当前字符是 ah,就尝试从这个位置开始向后寻找最长的交替笑声。
  2. 用指针 j 从当前字符的下一个位置开始向后扫描,每次检查当前字符与下一个字符是否构成 ah 的交替(即不同)。 如果交替成立,就继续向后移动指针,并累加长度。
  3. 一旦遇到无法交替的情况(比如相同的字母相邻,或者遇到不是 a/h 的字符),就停止当前这一轮的寻找。
  4. 记录下每一轮找到的交替笑声长度,取最大值作为答案。

注意

  • 每次找到一段合法的交替序列后,外层循环的 i 会随着内层指针 j 一起移动,避免重复检查。
  • 代码只关心连续的交替序列,不要求子序列(即不能跳过字符),因此适用于本题中“笑声必须连续”的要求(如果题目允许不连续,则上述代码不适用)。

#include <iostream>
using namespace std;

int main() {
    int n;cin>>n;
    string s;cin>>s;
    int cnt = 0, mx = 0;
    for(int i = 0;i < s.size();++i){
        if(s[i] == 'a' || s[i] == 'h'){
            cnt = 1;
            for(int j = i + 1;j < s.size();){
                if(s[j] == 'h' && s[i] == 'a' || 
                    s[j] == 'a' && s[i] == 'h'
                ){
                    j++;i++;
                    cnt++;
                }else{
                    break;
                }
            }
            mx = max(mx, cnt);
        }
    }
    cout<<mx<<endl;
}
// 64 位输出请用 printf("%lld")