Advertisement
a53

siruri4

a53
Apr 28th, 2022
128
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.13 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #define ULL unsigned long long int
  3. using namespace std;
  4.  
  5. bool CifreDistincte(ULL n)
  6. {
  7. int FrC[10]={0}; /// c=cifra si FrC=Frecventa cifreloe
  8. while(n)
  9. ++FrC[n%10],n/=10;
  10. for(int i=1;i<=9;++i)
  11. if(FrC[i]>1)
  12. return false;
  13. return true;
  14. }
  15.  
  16. ULL UltimaCifra(ULL n,ULL &p) /// Intoarce ultima cifra a lui n (exemplu, pentru n=5673 intoarce 5)
  17. {
  18. while(n>9)
  19. p*=10,n/=10;
  20. p*=10;
  21. return n;
  22. }
  23.  
  24. ULL Transforma(ULL n)
  25. {
  26. ULL aux=n;
  27. int FrC[10]={0};
  28. while(aux) /// Aflu frecventa cifrelor
  29. ++FrC[aux%10],aux/=10;
  30. ULL p=1;
  31. while(n) /// Elimin cifrele care se repeta
  32. {
  33. int c=n%10;
  34. if(c&&FrC[c]==1)
  35. aux=aux+c*p,p*=10,--FrC[c]=0;
  36. else
  37. if(c&&FrC[c]>1)
  38. --FrC[c];
  39. n/=10;
  40. }
  41. return aux;
  42. }
  43.  
  44. int NrCifre(int n)
  45. {
  46. int nrc=0;
  47. while(n)
  48. ++nrc,n/=10;
  49. return nrc;
  50. }
  51.  
  52. int main()
  53. {
  54. int c,n;
  55. ifstream fin("siruri.in");
  56. fin>>c>>n;
  57. ofstream fout("siruri.out");
  58. if(c==1) /// Cerinta 1 = cate numere au cifre distincte (nu necesita transformare)
  59. {
  60. int x,cnt=0;
  61. for(int i=1;i<=n;++i)
  62. {
  63. fin>>x;
  64. if(CifreDistincte(x))
  65. ++cnt;
  66. }
  67. fout<<cnt;
  68. return 0;
  69. }
  70. ULL x,xu,p,a[n+2]; /// Declar numarul curent x din sir si urmatorul numar din sir xu si sirul de numere a
  71. fin>>x; /// Se citeste primul numar
  72. int N=0,i=1; /// N=numarul de numere dupa prelucrare
  73. while(i<=n) /// Se citesc urmatoarele numere din sir si se prelucreza
  74. {
  75. fin>>xu,++i; /// Citim urmatorul numar din sir
  76. p=1; /// p=putere a lui 10 pentru numarul de cifre ale numarului xu (pentru a putea uni x cu xu)
  77. if(x%10!=UltimaCifra(xu,p)) /// Daca prima cifra a lui x NU este egala cu ultima a lui xu
  78. { /// doar se transforma numarul
  79. a[++N]=Transforma(x),x=xu;
  80. }
  81. else
  82. {
  83. xu=Transforma(xu),p=1;
  84. while(x%10==UltimaCifra(xu,p)) /// Cat timp prima cifra a lui x este egala cu ultima a lui xu
  85. {
  86. x=x*p+xu,x=Transforma(x); /// le unim in x si apoi eliminam cifrele care se repeta
  87. fin>>xu,++i,p=1; /// x-ul va fi cel prelucrat
  88. }
  89. a[++N]=x,x=xu;
  90. }
  91. }
  92. ///for(int i=1;i<=N;++i)
  93. ///fout<<a[i]<<' ';
  94. ///fout<<endl;
  95. if(c==2) /// Cerinta 2 = cate numere contine sirul dupa toate operatiile de unire
  96. {
  97. fout<<N<<'\n';
  98. }
  99. else /// Cerinta 3 = care e numarul maxim de cifre ale unui numar din noul sir si cate astfel de numere sunt
  100. {
  101. int FrNrC[N+1],NrMaxC=0,Nr=1;
  102. for(int i=1;i<=N;++i)
  103. {
  104. FrNrC[i]=NrCifre(a[i]);
  105. if(FrNrC[i]>=NrMaxC)
  106. {
  107. if(FrNrC[i]>NrMaxC) /// E strict mai mare
  108. NrMaxC=FrNrC[i],Nr=1;
  109. else /// Sunt egale
  110. ++Nr;
  111. }
  112. }
  113. fout<<NrMaxC<<' '<<Nr<<'\n';
  114. }
  115. return 0;
  116. }
  117.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement