Destacados operativos
título Descripción
Hay un movimiento lejos de la operación de 26 tipos, cada operación utilizamos a, b, c, d, ..., x, y, z en lugar de símbolos.
Ahora hay una secuencia de operación de carne de longitud n, que puede ahora desde el interior a cabo ciertas operaciones para combinar en una operación de vídeo, por ejemplo, la secuencia de funcionamiento es ABCDABCD, a continuación, el funcionamiento del vídeo tendrá a, b, c, d, ab, ac, ad , etc. (es decir, la operación de la sub-secuencia). se preguntó longitud k y la diferente naturaleza de la operación de vídeo cuántos.
por ejemplo, para ABAB, 2 de diferente longitud y la naturaleza de los resultados tienen AB, AA, BA, BB.
Teniendo en cuenta la respuesta puede ser muy grande, sólo tiene que la producción en 1e9 + 7 importancia mueren responder a ella.
Introduzca una descripción:
La primera línea de dos números enteros n, K.
La segunda línea de una cadena de longitud n, para asegurar la presencia de letras minúsculas.
Descripción Salida:
Se indica la longitud de una línea es el número de número entero k y la diferente naturaleza de la operación del vídeo.
Orar secuencia de números, DP obvio para su uso, y al parecer se lanzó ecuación DP:
dp [i] [j] = dp [i-1] [j-1] + dp [i-1] [j];
El problema es que no es repetitivo, cómo volver a hacer?
Puede grabar la posición de la última aparición de cada letra, y esta ecuación es el prefijo similares, por lo que un valor final de la posición aparece restando las letras actuales antes de la línea;
dp [i] [j] - = dp [pre [s [i] - 'A'] - 1] [j-1];
Se hace notar aquí de longitud cero;
código:
#include<bits/stdc++.h>
#define LL long long
#define pa pair<int,int>
#define ls k<<1
#define rs k<<1|1
#define inf 0x3f3f3f3f
using namespace std;
const int N=100010;
const int M=2000100;
const LL mod=1e9+7;
LL dp[1100][1100];
char s[1100];
int pre[30];
int main(){
int n,k;
cin>>n>>k;
scanf("%s",s+1);
dp[0][0]=1;
for(int i=1;i<=n;i++){//位置
for(int j=0;j<=i;j++){//长度
dp[i][j]=dp[i-1][j-1]+dp[i-1][j];
if(pre[s[i]-'a']) dp[i][j]-=dp[pre[s[i]-'a']-1][j-1];
dp[i][j]%=mod;
}
pre[s[i]-'a']=i;
}
if(k==0){
cout<<1<<endl;
return 0;
}
if(dp[n][k]<0) dp[n][k]+=mod;
cout<<dp[n][k]<<endl;
return 0;
}