Obtendrá una cadena binaria s (recuerde que si cada carácter es 0 o 1, entonces una cadena es binaria).
Sea f (t) la representación decimal del número entero t, escrito en forma binaria (puede contener ceros a la izquierda). Por ejemplo, f (011) = 3, f (00101) = 5, f (00001) = 1, (10) = 2, f (000) = 0 yf (000100) = 4.
Si r-l + 1 = f (sl ... sr), las subcadenas sl, sl + 1, ..., sr son buenas.
Por ejemplo, la cadena s = 1011 tiene 5 subcadenas: s1 ... s1 = 1, s3 ... s3 = 1, s4 ... s4 = 1, s1 ... s2 = 10, s2 ... s4 = 011.
Su tarea es contar el número de subcadenas buenas en la cadena s.
Solución:
Encuentre el número de subcadenas de igual valor y longitud.
El método consiste en contar el número de ceros a la izquierda en tiempo real, y luego usar cada número como punto de partida para generar una cadena binaria en tiempo real. Si encuentra una relación de longitud pequeña y el número de ceros a la izquierda es mayor que la diferencia entre los dos, es legal.
#include <bits / stdc ++. h> usando el espacio de nombres std; typedef largo largo ll; const int maxn = 2e5 + 100 ; cuerda s; int main () { int T; scanf ( " % d " , & T); mientras que (T-- ) { cin >> s; int ans = 0 ; int pre = 0 ; para ( int i = 0 ; i <s.length (); i ++) { if (s [i] == ' 0 ' ) pre ++ ; más { int r = i; int cnt = 1 ; para ( int j = 0 ; j < 18 ; j ++ ) { if (cnt <= pre + (r-i + 1 )) ans ++ ; if (r == s.length () - 1 ) break ; cnt = cnt * 2 + (s [++ r] - ' 0 ' ); } // Extensión hacia adelante, si la longitud no es suficiente, use el 0 inicial pre = 0 ; } } printf ( " % d \ n " , ans) ; } }