Se consideră un set de două șiruri de caractere X
și Y
. Șirul X
este format din caractere din mulțimea {'A'..'Z', 'a' ..'z', '*'}
, iar șirul Y
este format din caractere din mulțimea {'A'..'Z', 'a'..'z'}
. Lungimea șirului Y
este mai mare sau egală cu numărul de caractere *
din X
. Caracterele *
din șirul X
vor fi înlocuite cu caractere din Y
, evident fără a depăși numărul de apariții ale acestora.
Cerința
Fiind date N
seturi de câte două șiruri fiecare, (X
1
, Y
1
), (X
2
, Y
2
), …, (X
N
, Y
N
), să se determine lungimea celui mai lung subșir strict crescător ce se poate forma în X
i
prin înlocuirea caracterelor *
cu caractere din Y
i
, 1 ≤ i ≤ N
.
Date de intrare
Fișierul de intrare addchar.in
conține pe prima linie numărul natural nenul N
, iar apoi pe linii distincte, cele N
seturi de câte două șiruri: (X
1
, Y
1
), (X
2
, Y
2
), …, (X
N
, Y
N
).
Date de ieșire
Fișierul de ieșire addchar.out
va avea N
linii. Fiecare linie conține o singură valoare naturală ce reprezintă lungimea celui mai lung subșir strict crescător ce se poate forma în X
i
prin înlocuirea caracterelor *
cu caractere din Y
i
, 1 ≤ i ≤ N
.
Restricții și precizări
1 ≤ N ≤ 20
2 ≤ lungimea(X
i
) ≤ 10000
1 ≤ lungimea(Y
i
) < 10000
1 ≤ număr maxim de caractere '*' ≤ min(5000, lungimea(Y
i
))
Exemplu
addchar.in
2 C*a**Fceb*B DbaAaBA z*y*tm** ceAB
addchar.out
6 4
Explicație
Sunt două perechi de șiruri. Prima pereche este X1 = C*a**Fceb*B
, Y1 = DbaAaBA
.
Se pot forma mai multe secvențe: CBaAAFcebaB
, CAaBDFcebAB
, CAaBDFcebaB
, …
Cel mai lung subșir strict crescător se obține din șirul CAaBDFcebAB
, este ABDFce
și are lungimea 6.
A doua pereche de șiruri este X2 = z*y*tm**
, Y2 = ceAB
. Cel mai lung subșir strict crescător se obține din șirul zAyBtmce
și are lungimea 4
: ABce
.
Cum e corect?
cout < "As la info";
cout << "As la info";
cout >> "As la info";
Felicitări! Poți mai mult?
Avem sute de probleme pentru tine, fiecare cu explicații ușor de înțeles.
Greșit, dar nu-i bai!
Antrenează-te cu sutele de probleme pe care ți le-am pregătit. Îți explicăm fiecare problemă în parte.
Rezolvare
Iată rezolvarea de 100 de puncte pentru problema addchar:
/// O(N * 2 sigma) / test
#include <bits/stdc++.h>
#define N 10005
using namespace std;
int T, d[54];
bool f[54];
char A[N], B[N];
int cod(char c)
{
if(c >= 'A' && c <= 'Z') return c - 'A';
else return c - 'a' + 26;
}
void solve()
{
memset(d, 0, sizeof(d));
memset(f, 0, sizeof(f));
scanf("%s\n", A + 1);
scanf("%s\n", B + 1);
int n = strlen(A + 1);
int m = strlen(B + 1);
for(int i = 1; i <= m; ++i)
f[cod(B[i])] = 1;
if(A[1] == '*'){
for(int i = 0; i < 52; ++i)
d[i] = f[i];
} else d[cod(A[1])] = 1;
for(int i = 1; i < 52; ++i)
d[i] = max(d[i - 1], d[i]);
for(int i = 2; i <= n; ++i){
if(A[i]=='*'){
if(f[0]) d[0] = max(d[0], 1);
for(int i = 51; i >= 1; --i){
if(f[i])
d[i] = max(d[i], d[i - 1] + 1);
}
} else{
int c = cod(A[i]);
if(c==0) d[0] = max(d[0], 1);
else d[c] = max(d[c], d[c - 1] + 1);
}
for(int i = 1; i < 52; ++i)
d[i] = max(d[i], d[i - 1]);
}
printf("%d\n", d[51]);
}
int main()
{
freopen("addchar.in", "r", stdin);
freopen("addchar.out","w", stdout);
scanf("%d\n", &T);
while (T--)
solve();
return 0;
}
Atenție
Enunțurile afișate pe această pagină aparțin exclusiv site-ului PbInfo. Astfel, pentru ștergerea conținutului, puteți să ne contactați la adresa .
Rezolvarea problemei #2561 addchar
Pe această pagină găsești rezolvarea de 100 de puncte pentru problema #2561 addchar de pe PbInfo.ro. Atenție: nu încurajăm copiatul codului! Totuși, credem cu tărie că analizarea unei soluții corecte este o metodă foarte ușoară de a învăța informatică, astfel că oferim sursele pentru peste 1500 de probleme de pe platforma PbInfo.ro.
Pentru rezolvări PbInfo de la peste 1500 de probleme, vă invităm să intrați pe site-ul nostru!