Răspuns :
# include <fstream>
# include <cstring>
using namespace std;
# define max(a, b) ((a) < (b) ? (b) : (a))
# define Lmax 100003
ifstream f("charlie.in");
ofstream g("charlie.out");
char s[Lmax], st[Lmax];
int p, L, vf, k, i, Max, j;
long long S;
void afis()
{
for(int i=1; i <=vf; ++i)
g << st[i];
g<< "\n";
}
int main()
{
f >> p; f.get();
f.getline(s, 100001);
L = strlen(s);
if (p == 1) //a)
{
k = i = 0;
while ( i < L )
{
j = i;
while (s[j] > s[j+1] && s[j+1] < s[j+2] && j + 2 < L)
j += 2;
if (j - i >= 2)
{
if ( j - i + 1 > Max ) Max = j - i + 1;
i = j;
}
++i;
}
g << Max << "\n";
}
else //b)
{
st[1] = s[0]; st[2] = s[1];
i = vf = 2;
while ( i < L )
{
while (s[i] > st[vf] && st[vf] < st[vf-1] && vf > 1)
{
S += max(s[i] - 'a' + 1, st[vf-1] - 'a' + 1);
--vf;
}
st[++vf] = s[i];
++i;
}
afis();
g << S << "\n";
}
return 0;
}
# include <cstring>
using namespace std;
# define max(a, b) ((a) < (b) ? (b) : (a))
# define Lmax 100003
ifstream f("charlie.in");
ofstream g("charlie.out");
char s[Lmax], st[Lmax];
int p, L, vf, k, i, Max, j;
long long S;
void afis()
{
for(int i=1; i <=vf; ++i)
g << st[i];
g<< "\n";
}
int main()
{
f >> p; f.get();
f.getline(s, 100001);
L = strlen(s);
if (p == 1) //a)
{
k = i = 0;
while ( i < L )
{
j = i;
while (s[j] > s[j+1] && s[j+1] < s[j+2] && j + 2 < L)
j += 2;
if (j - i >= 2)
{
if ( j - i + 1 > Max ) Max = j - i + 1;
i = j;
}
++i;
}
g << Max << "\n";
}
else //b)
{
st[1] = s[0]; st[2] = s[1];
i = vf = 2;
while ( i < L )
{
while (s[i] > st[vf] && st[vf] < st[vf-1] && vf > 1)
{
S += max(s[i] - 'a' + 1, st[vf-1] - 'a' + 1);
--vf;
}
st[++vf] = s[i];
++i;
}
afis();
g << S << "\n";
}
return 0;
}
Iti ofer sursa echivalenta cu sursa oficiala. In mod normal nu ti-as fi trimis aceasta sursa pentru ca ai deja sursa lui Ap53 care este foarte buna. Dar pentru ca m-ai rugat in privat iti trimit si aceasta sursa. Succes!
#include <bits/stdc++.h>
using namespace std;
const int Nmax = 100000 + 1;
char str[Nmax];
char stiva[Nmax];
int top = 0;
int main()
{
ifstream in("charlie.in");
ofstream out("charlie.out");
int p;
in >> p;
in >> str;
if (p == 1)
{
int lgmax = 0;
int n = strlen(str);
for (int i = 0; i < n; ++i)
{
int j = i;
int lg = 0;
while (j + 2 < n && str[j] > str[j + 1] && str[j + 1] < str[j + 2])
{
j += 2;
lg += 2;
}
if (lg)
{
lg++;
i = j - 1;
}
lgmax = max(lgmax, lg);
}
out << lgmax << "\n";
}
else
{
int suma = 0;
int n = strlen(str);
for (int i = 0; i < n; ++i)
{
while (top >= 2 && stiva[top - 2] > stiva[top - 1] && stiva[top - 1] < str[i])
{
suma += (max(stiva[top - 2], str[i]) - 'a' + 1);
top--;
}
stiva[top++] = str[i];
}
for (int i = 0; i < top; ++i)
out << stiva[i];
out << "\n" << suma << "\n";
}
return 0;
}
#include <bits/stdc++.h>
using namespace std;
const int Nmax = 100000 + 1;
char str[Nmax];
char stiva[Nmax];
int top = 0;
int main()
{
ifstream in("charlie.in");
ofstream out("charlie.out");
int p;
in >> p;
in >> str;
if (p == 1)
{
int lgmax = 0;
int n = strlen(str);
for (int i = 0; i < n; ++i)
{
int j = i;
int lg = 0;
while (j + 2 < n && str[j] > str[j + 1] && str[j + 1] < str[j + 2])
{
j += 2;
lg += 2;
}
if (lg)
{
lg++;
i = j - 1;
}
lgmax = max(lgmax, lg);
}
out << lgmax << "\n";
}
else
{
int suma = 0;
int n = strlen(str);
for (int i = 0; i < n; ++i)
{
while (top >= 2 && stiva[top - 2] > stiva[top - 1] && stiva[top - 1] < str[i])
{
suma += (max(stiva[top - 2], str[i]) - 'a' + 1);
top--;
}
stiva[top++] = str[i];
}
for (int i = 0; i < top; ++i)
out << stiva[i];
out << "\n" << suma << "\n";
}
return 0;
}
Vă mulțumim pentru vizita pe site-ul nostru dedicat Informatică. Sperăm că informațiile disponibile v-au fost utile și inspiraționale. Dacă aveți întrebări sau aveți nevoie de suport suplimentar, suntem aici pentru a vă ajuta. Ne face plăcere să vă revedem și vă invităm să adăugați site-ul nostru la favorite pentru acces rapid!