Advertisement
a53

cat2pal

a53
Jun 23rd, 2021
196
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.25 KB | None | 0 0
  1. #include <fstream>
  2. using namespace std;
  3. ifstream fin("cat2pal.in");
  4. ofstream fout("cat2pal.out");
  5. int N, v[10002], nw, c, ok, i, j, k, C , P1, P2;
  6. long long int w[100];
  7. long long int z, s, t, s1, s2, t1, t2, x1, x2, x, y, r, X, A, vi,vj, p,q,d;
  8. char f[100002], f0[100002], f1[100002];
  9.  
  10. int main()
  11. {
  12. fin>>C;
  13. if (C==1)
  14. {fin>>A;
  15. /*voi adauga in w[] toate solutiile posibile, apoi sortez si apoi
  16. verific daca solutiile posibile sunt printre prefixele sau sufixele
  17. oglinditului lui A eventual precedate sau succedate de una dintre
  18. cifrele 0,1,...,9 */
  19. x=A; while (x%10==0){x=x/10;}; //tai zerourile de la final
  20. p=1; y=0; do {y=y*10+x%10;x=x/10;p=p*10;} while(x>0); //y=oglindit(A)
  21. //adaug sufixele si prefixele lui y
  22. nw=0; q=p; r=y;
  23. do { w[++nw]=y%q; w[++nw]=r;
  24. q=q/10; r=r/10;
  25. } while(r);
  26. //lipesc cate o cifra la stanga si la dreapta lui y si adaug in w[]
  27. for (c=0; c<=9; c++) {
  28. d=y*10+c; if (d<=A*10) {w[++nw]=d;}
  29. d=c*p+y; if (d<=A*10) {w[++nw]=d;}
  30. }
  31. //sortez candidatii
  32. for (i=1; i<=nw-1; i++)
  33. for (j=i+1; j<=nw; j++)
  34. if (w[i]>w[j]){ int aux=w[i]; w[i]=w[j]; w[j]=aux; }
  35. //verific si selectez doar solutiile
  36. w[0]=0; P1=0;
  37. q=1; while (q<=A) {q=q*10;}
  38. for (i=1; i<=nw; i++)
  39. if (w[P1]!=w[i]){ //verific daca w[i] este o solutie
  40. p=1; while (p<=w[i]){p=p*10;}
  41. s1=0; x1=A*p+w[i]; t1=x1; do{s1=s1*10+t1%10;t1=t1/10;}while(t1);
  42. s2=0; x2=w[i]*q+A; t2=x2; do{s2=s2*10+t2%10;t2=t2/10;}while(t2);
  43. if (s1==x1 ||s2==x2){ //DA, w[i] este solutie
  44. w[++P1]=w[i];
  45. }
  46. }
  47. fout<<P1<<"\n";
  48. }
  49. if (C==2) {fin>>N; for (i=1;i<=N;i++){ fin>>v[i]; f[v[i]]=1; }
  50. /* f[x]=1 daca x este din v[]
  51. orice palindrom de lungime j se poate identifica prin sufix de
  52. lungime j-j/2
  53. f0[x]=1 daca x este sufix de palindrom de lungime para
  54. f1[x]=1 daca x este sufix de palindrom de lungime impara
  55. */
  56. //oglinditele prefixelor
  57. for (i=1; i<=N; i++) {
  58. vi=v[i]; while (vi && vi%10==0) {vi=vi/10;}
  59. p=1; y=0; do {y=y*10+vi%10; vi/=10; p=p*10;} while(vi);
  60. do{
  61. if (y*10>=p && f[y]==1){//daca y este element din v[]
  62. z=p*v[i]+y;
  63. s=z; t=0; j=0; do{j++; t=t*10+s%10;s=s/10;}while(s);
  64. if (z==t) {//si lipit la dreapta lui v[i] avem palindrom
  65. //construim in s sufixul identificator pentru z
  66. k=j-j/2; s=0; while (k) {s=s*10+t%10; t=t/10; k--;}
  67. if (j%2==0){f0[s]=1;}
  68. else {f1[s]=1;}
  69. }
  70. }
  71. p=p/10; y=y%p;
  72. } while(p>=10);
  73. }
  74. //oglinditele sufixelor
  75. for (i=1; i<=N; i++) {
  76. vi=v[i]; p=1; y=0; do {y=y*10+vi%10;vi=vi/10;p=p*10;} while(vi);
  77. do {
  78. if (f[y]==1){ // daca este din v[]
  79. z=y*p+v[i]; //lipim in stanga lui v[i]
  80. s=z; t=0; j=0; do {j++; t=t*10+s%10;s=s/10;} while(s);
  81. if (z==t && f[y]==1){//este palindrom
  82. //construim in s sufixul identificator pentru z
  83. k=j-j/2; s=0; while(k) {s=s*10+t%10;t=t/10;k--;}
  84. if (j%2==0) {f0[s]=1;}
  85. else {f1[s]=1;}
  86. }
  87. }
  88. y=y/10;
  89. } while(y>0);
  90. }
  91. P2=0;
  92. for(i=0; i<100000; i++) {P2=P2+f0[i]+f1[i];}
  93. fout<<P2<<"\n";
  94. }
  95. fout.close(); fin.close();
  96. return 0;
  97. }
  98.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement