Fie n
un număr natural și M={S
1
,S
2
,…,S
n
}
o mulțime de șiruri de caractere nevide. Fie S
k
un șir de caractere din M
. Atunci, orice caracter al lui S
k
aparține mulțimii {'a','b'}
. Notăm prin |S
k
|
numărul caracterelor șirului S
k
sau, echivalent, lungimea sa. O subsecvență S
k
[i:j]
a lui S
k
este formată din caracterele situate pe pozițiile consecutive i, i+1, .., j
. Astfel, dacă S
k
= 'abbbaababa'
, atunci S
k
[3:6] = 'bbaa'
sau subsecvența evidențiată: 'ab
bbaa
baba'
.
Cerința
Fiind dată o mulțime M
, se cere să se determine lungimea maximă a unei subsecvențe care se găsește în toate șirurile din M
.
Date de intrare
Fișierul de intrare subsecvente.in
conține pe prima linie un număr natural n
egal cu cardinalul mulțimii M
. Pe fiecare din următoarele n
linii se găsește câte un șir din mulțimea M
.
Date de ieșire
Fișierul de ieșire subsecvente.out
va conține pe prima linie un singur număr natural egal cu lungimea subsecvenței găsite.
Restricții și precizări
1 < n < 5
- Dacă
|S| = |S
1
| + |S
2
| + … + |S
n
|
, atunci|S| < 50 001
- Se garantează că va exista întotdeauna soluție
- Se garantează că rezultatul nu va depăși
60
- Pentru
30%
din teste:|S| < 101
- Pentru
55%
din teste:|S| < 3 501
- Pentru
80%
din teste:|S| < 10 001
Exemplu
subsecvente.in
4 abbabaaaaabb aaaababab bbbbaaaab aaaaaaabaaab
subsecvente.out
5
Explicație
Lungimea unei subsecvenţe comune de lungime maximă este 5
.
În exemplu subsecvența comună de lungime 5
este aaaab
:
abbaba
aaaab
b
, aaaab
abab
, bbbb
aaaab
, aaa
aaaab
aaab
.
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 Subsecvente:
#include<cstdio>
#include<cstring>
#include<vector>
#include <algorithm>
using namespace std;
int p2,lg,mask,i,j,k,p,q,n,sol(int);
vector<int>s[2],cod;
char a[50010];
int main()
{
freopen("subsecvente.in","r",stdin);
freopen("subsecvente.out","w",stdout);
int n; scanf("%d\n", &n);
s[0].push_back(0);s[1].push_back(0);cod.push_back(0);
s[0].push_back(0);s[1].push_back(0);cod.push_back(0);
for(p2=1,n=1;scanf("%s",a+1)+1;p2<<=1)
{
lg=strlen(a+1);mask|=p2;
for(i=1;i<=lg;i++)
{
j=min(i+59,lg);
for(k=i,p=1;k<=j;k++)
{
q=a[k]-'a';
if(!s[q][p])
{s[0].push_back(0);s[1].push_back(0);cod.push_back(0);s[q][p]=++n;}
p=s[q][p];cod[p]|=p2;
}
}
}
cod[1]=mask;
printf("%d\n",sol(1)-1);
return 0;
}
int sol(int nod)
{
int sa,sb;
if(!nod||cod[nod]!=mask)return 0;
sa=sol(s[0][nod]);
sb=sol(s[1][nod]);
return max(sa,sb)+1;
}
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 #1042 Subsecvente
Pe această pagină găsești rezolvarea de 100 de puncte pentru problema #1042 Subsecvente 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!