Eliminación de cadenas

Inserte la descripción de la imagen aquí
Puntero doble lío alrededor.

Si la longitud del prefijo igual más larga es mayor que 1, la operación elimina directamente un número de este prefijo y luego el sistema elimina este prefijo.

De lo contrario, busque la última subcadena igual mayor que 1 y elimine un número en esta subcadena, y luego el sistema elimina el prefijo igual de longitud 1.

#include <bits/stdc++.h>

using namespace std;
typedef long long ll;

const int maxn = 2e5 + 10;
int n,a[maxn];
char s[maxn];
int main() {
    
    
    int _;
    scanf("%d", &_);
    while (_--) {
    
    
        scanf("%d", &n);
        scanf("%s", s + 1);
        s[n + 1] = 'a';
        int cnt = 1, num = 0;
        for (int i = 2; i <= n + 1; i++) {
    
    
            if (s[i] == s[i - 1]) {
    
    
                cnt++;
            } else {
    
    
                a[++num] = cnt;
                cnt = 1;
            }
        }
        if (num == 1) {
    
    
            printf("1\n");
            continue;
        }
        int ans = 0;
        int l = 1, r = 1;
        while (l <= r && l <= num) {
    
    
            if (a[l] >= 2) {
    
    
                ans++;
                l++;
            } else {
    
    
                while (r <= num && a[r] == 1) {
    
    
                    r++;
                }
                if (r <= num && a[r] >= 1) {
    
    
                    a[r]--;
                    l++;
                } else {
    
    
                    l++;
                    l++;
                }
                ans++;
            }
            while (r < l) r++;
        }
        printf("%d\n", ans);
    }
    return 0;
}

Supongo que te gusta

Origin blog.csdn.net/weixin_43601103/article/details/112786914
Recomendado
Clasificación