Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- #define ULL unsigned long long int
- using namespace std;
- bool CifreDistincte(ULL n)
- {
- int FrC[10]={0}; /// c=cifra si FrC=Frecventa cifreloe
- while(n)
- ++FrC[n%10],n/=10;
- for(int i=1;i<=9;++i)
- if(FrC[i]>1)
- return false;
- return true;
- }
- ULL UltimaCifra(ULL n,ULL &p) /// Intoarce ultima cifra a lui n (exemplu, pentru n=5673 intoarce 5)
- {
- while(n>9)
- p*=10,n/=10;
- p*=10;
- return n;
- }
- ULL Transforma(ULL n)
- {
- ULL aux=n;
- int FrC[10]={0};
- while(aux) /// Aflu frecventa cifrelor
- ++FrC[aux%10],aux/=10;
- ULL p=1;
- while(n) /// Elimin cifrele care se repeta
- {
- int c=n%10;
- if(c&&FrC[c]==1)
- aux=aux+c*p,p*=10,--FrC[c]=0;
- else
- if(c&&FrC[c]>1)
- --FrC[c];
- n/=10;
- }
- return aux;
- }
- int NrCifre(int n)
- {
- int nrc=0;
- while(n)
- ++nrc,n/=10;
- return nrc;
- }
- int main()
- {
- int c,n;
- ifstream fin("siruri.in");
- fin>>c>>n;
- ofstream fout("siruri.out");
- if(c==1) /// Cerinta 1 = cate numere au cifre distincte (nu necesita transformare)
- {
- int x,cnt=0;
- for(int i=1;i<=n;++i)
- {
- fin>>x;
- if(CifreDistincte(x))
- ++cnt;
- }
- fout<<cnt;
- return 0;
- }
- ULL x,xu,p,a[n+2]; /// Declar numarul curent x din sir si urmatorul numar din sir xu si sirul de numere a
- fin>>x; /// Se citeste primul numar
- int N=0,i=1; /// N=numarul de numere dupa prelucrare
- while(i<=n) /// Se citesc urmatoarele numere din sir si se prelucreza
- {
- fin>>xu,++i; /// Citim urmatorul numar din sir
- p=1; /// p=putere a lui 10 pentru numarul de cifre ale numarului xu (pentru a putea uni x cu xu)
- if(x%10!=UltimaCifra(xu,p)) /// Daca prima cifra a lui x NU este egala cu ultima a lui xu
- { /// doar se transforma numarul
- a[++N]=Transforma(x),x=xu;
- }
- else
- {
- xu=Transforma(xu),p=1;
- while(x%10==UltimaCifra(xu,p)) /// Cat timp prima cifra a lui x este egala cu ultima a lui xu
- {
- x=x*p+xu,x=Transforma(x); /// le unim in x si apoi eliminam cifrele care se repeta
- fin>>xu,++i,p=1; /// x-ul va fi cel prelucrat
- }
- a[++N]=x,x=xu;
- }
- }
- ///for(int i=1;i<=N;++i)
- ///fout<<a[i]<<' ';
- ///fout<<endl;
- if(c==2) /// Cerinta 2 = cate numere contine sirul dupa toate operatiile de unire
- {
- fout<<N<<'\n';
- }
- else /// Cerinta 3 = care e numarul maxim de cifre ale unui numar din noul sir si cate astfel de numere sunt
- {
- int FrNrC[N+1],NrMaxC=0,Nr=1;
- for(int i=1;i<=N;++i)
- {
- FrNrC[i]=NrCifre(a[i]);
- if(FrNrC[i]>=NrMaxC)
- {
- if(FrNrC[i]>NrMaxC) /// E strict mai mare
- NrMaxC=FrNrC[i],Nr=1;
- else /// Sunt egale
- ++Nr;
- }
- }
- fout<<NrMaxC<<' '<<Nr<<'\n';
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement