Dato una stringa di cifre decimali, devo trovare il numero di tutte le sottostringhe divisibili per 3 nell'intervallo da L a R [entrambi inclusi], dove L & R sono indice [1-based] della stringa specificata
string length <= 100000
Ho provato l'approccio Naive di iterare su tutte le possibili sottostringhe & ottenere la risposta, ma non è abbastanza veloce, specialmente per più coppie L & R.
Poi ho provato un approccio DP. Posso ottenere tutte le sottostringhe possibili divisibili per 3 nell'intera stringa, cioè non sono in grado di codificare la soluzione DP che dà risultato per un determinato intervallo.
Soluzione DP che ho provato (non ne sono completamente sicuro):
for(i=0 ; i<n ; i++) {
for(j=0 ; j<3 ; j++) {
dp[i][j]=0 ;
}
int curr = (input[i]-'0')%3 ;
dp[i][curr]++ ;
if(i) {
for(j=0 ; j<3 ; j++) {
if(curr % 3 == 0) { dp[i][j] += dp[i-1][j]; }
if(curr % 3 == 1) { dp[i][j] += dp[i-1][(j+2)%3]; }
if(curr % 3 == 2) { dp[i][j] += dp[i-1][(j+1)%3]; }
}
}
}
long long sum = 0;
for(i=0 ; i<n ; i++) { sum += dp[i][0] ; }
Questa soluzione può essere modificata per fornire risultati per un intervallo dato [L, R]?
Dopo aver cercato molto, ho appreso che i problemi delle query di intervallo sono risolti da Segment Tree, ma non sono sicuro di come Segment Tree + Lazy Propagation possa aiutare in questa domanda.
Quindi qual è un modo performante per contare tutte le sottostringhe divisibili per 3 nell'intervallo da L a R [entrambi inclusi]?
Modifica
Input: First Line contiene la stringa data. Le righe dopo contengono due interi che indicano rispettivamente L e R, dove sia L che R sono indice (basato su 1) di stringa.
Input:
301524 1 2 4 6 3 5
Output:
3 1 1
Explanation:
When L=1 & R=2 we get 3 possible substrings,{3}, {0}, {30}
& all these when considered as a decimal number are divisible by 3. Hence the output.
When L=4 & R=6 we get 6 possible substrings,{5} , {52}, {524}, {2}, {24}, {4}
& out of these only{24}
is divisible by 3.
Le ripetizioni in sottostringhe come 3333 contano più volte, quindi per L = 1 a R = 4 la risposta sarebbe 10, poiché abbiamo quattro volte 3, tre volte 33, due volte 333 e una volta 3333 (tutte divisibili per 3 ).