Data una stringa di cifre decimali, devo trovare il numero di tutte le sottosequenze divisibili per 6.efficiente algoritmo per contare il numero di sottosequenze divisibile per 6
1 ≤ value of String ≤ 10^6
Ho provato l'approccio ingenuo di iterare su tutte le possibili sottosequenze e ottenere la risposta, ma ciò non è abbastanza veloce, specialmente con un limite superiore così grande sulla lunghezza della stringa. Quindi ho provato un approccio DP ma non sono riuscito a codificare la soluzione DP per un determinato intervallo. Qualcuno può fornire qualche vantaggio in questo problema?
Sample Input
1232
Output
3
Strings Possible - 12,12,132
//Ans should be modulo 10^9 + 7
Di seguito si riporta il codice DP (non del tutto sicuro su di esso) per trovare il numero totale di sottosequenze divisibile per 3.Now per verificare la presenza di 6, abbiamo anche bisogno di incorporare la divisibilità per 2 che sta creando problemi per me.
for(i=0 ; i<n ; i++) {
for(j=0 ; j<3 ; j++) {
dp[i][j]=0 ;
}
int dig = (str[i]-'0')%3 ;
dp[i][dig]++ ;
if(i>0) {
for(j=0 ; j<3 ; j++) {
if(dig % 3 == 0) {
dp[i][j] += dp[i-1][j];
}
if(dig % 3 == 1) {
dp[i][j] += dp[i-1][(j+2)%3];
}
if(dig % 3 == 2) {
dp[i][j] += dp[i-1][(j+1)%3];
}
}
}
}
long long ans = 0;
for(i=0 ; i<n ; i++) {
ans += dp[i][0] ;
}
return ans;
puoi incollare del codice, mostraci cosa hai provato fino ad ora in modo che possiamo aiutarti. –
Sei sicuro che la lunghezza della stringa può essere 10⁶, oppure il valore che la stringa * rappresenta * è limitato a questo? – trincot
@SeekAddo Signore, ho aggiunto il mio codice. –