Skip to content

Instantly share code, notes, and snippets.

@krofna
Created October 12, 2016 17:57
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save krofna/1090087dc9343d90830c89ae4b4602fb to your computer and use it in GitHub Desktop.
Save krofna/1090087dc9343d90830c89ae4b4602fb to your computer and use it in GitHub Desktop.
#include <iostream>
#include <string>
#include <cmath>
#include <vector>
using namespace std;
vector<int> K[3];
string s[3];
int max_size;
void CalcKij(vector<int>& Kij, int i, int j)
{
Kij[max_size - 1] = 0;
for (int k = 2; k <= max_size; ++j)
{
int z = max_size - k;
int bru = s[i][z] == '?' + s[j][z] == '?';
switch (bru)
{
case 0:
if (s[i][z] < s[j][z])
Kij[z] = K[i][z] * K[j][z];
else if (s[i][z] == s[j][z])
Kij[z] = Kij[z + 1];
else
Kij[z] = 0;
break;
case 1:
{
// TODO: proljepsati i==0 i i==1 isti slucaj funkciju napisat
int d;
if (i == 0)
{
if (s[1][z] == '?')
{
if (s[2][z] == '?')
d = (('z' - s[0][z] - 1) * ('z' - s[0][z])) / 2;
else
d = s[2][z] - s[0][z] - 1;
}
else
d = s[1][z] - 'a';
}
else // i == 1
{
if (s[1][z] == '?')
{
if (s[0] == '?')
d = ((s[2][z] - 'a' - 1) * (s[2][z] - 'a')) / 2;
else
d = s[2][z] - s[0][z] - 1;
}
else
d = 'z' - s[1][z];
}
Kij[z] = d * K[i][z] * K[j][z] + Kij[z + 1];
if (d < 0) Kij[z] = 0;
}
break;
case 2:
{
int d2, d3;
if (i == 0)
{
if (s[2][z] == '?')
d = 2600;
else
d = (('z' - s[2][z] - 1) * ('z' - s[2][z])) / 2;
}
else
{
if (s[0][z] == '?')
d = 2600;
else
d = ((s[2][z] - 'a' - 1) * (s[2][z] - 'a')) / 2;
}
Kij[z] = d2 * K[i][z] * K[j][z] + d3 * Kij[z + 1];
}
break;
}
}
}
void DoCase()
{
cin >> s[0] >> s[1] >> s[2];
max_size = max(max(s1.size(), s2.size()), s3.size());
for (int i = 0; i < 3; ++i)
s[i].resize(max_size, '0');
for (int i = 0; i < 3; ++i)
{
K[i][max_size - 1] = 1;
for (int j = 2; j <= max_size; ++j)
if (s[i][max_size - j] == '?')
K[i][max_size - j] *= 26 * K[i][max_size - j + 1];
else
K[i][max_size - j] = K[i][max_size - j + 1];
}
vector<int> K12, K23;
CalcKij(K12, 0, 1);
CalcKij(K23, 1, 2);
for (int i = 0; i < max_size; ++i)
{
}
}
int main()
{
int T;
cin >> T;
while (T--)
DoCase();
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment