AGC027E ABBreviate


Conjunto de enlaces \ (v (a) = 1, v (b) = 2 \) , entonces no importa cómo opere, la suma de peso de todos los caracteres no cambiará en el significado de \ (\ bmod3 \) .
Usamos \ (w (s) \) para representar la suma de los pesos de todos los caracteres en la cadena \ (s \) \ (\ bmod3 \) .
Considere si la cadena \ (s \) puede convertirse en una cadena \ (t (t \ ne s) \) .
Enumere cada carácter en \ (t \) en orden inverso y tome una sección de \ (s \) que satisfaga el sufijo más corto de ese carácter. Si puede hacerlo al final, entonces \ (s \) dejará un prefijo \ (pre \) , si \ (w (pre) = 0 \) llamamos una coincidencia exitosa.
Entonces, la condición suficiente y necesaria para que la cadena \ (s \) pueda convertirse en la cadena \ (t \) es que se puede hacer coincidir con éxito y hay dos caracteres adyacentes e idénticos en \ (s \) .
Luego, primero decidimos que no hay dos caracteres adyacentes e idénticos en \ (s \) , luego la respuesta es \ (1 \) .
Deje que \ (f_i \) denote el número de \ (t \) que \ (pre_i \) puede convertirse , y transfiera para enumerar en qué carácter se encuentra el segmento en el que se encuentra \ (i \) , y al mismo tiempo, debe juzgarse especialmente el carácter completo. El caso donde la cadena se convierte en un personaje.

#include<cstdio>
#include<cstring>
const int N=100007,P=1000000007;
char str[N];int a[N],f[N],las[3];
int main()
{
    scanf("%s",str+1);int n=strlen(str+1),flg=0;
    for(int i=1;i<=n;++i) if(a[i]=(a[i-1]+str[i]-'a'+1)%3,str[i]==str[i-1]) flg=1;
    if(!flg) return puts("1"),0;;
    for(int i=1;i<=n;++i) f[i]=(1ll*f[las[0]]+f[las[1]]+f[las[2]]+(a[i]>=1)-f[las[a[i]]]+P)%P,las[a[i]]=i;
    printf("%d",f[n]);
}

Supongo que te gusta

Origin www.cnblogs.com/cjoierShiina-Mashiro/p/12747288.html
Recomendado
Clasificación