понедельник, 11 июня 2012 г.

Яндекс офигел!

Сегодня пишу тестовое задание на стажировку в Яндекс. Пока не очень хорошо всё идёт. Задачи у них вот такие: http://narod.ru/disk/33108589001/task.zip.html .

Вот такие фотки:

Решать как знаю. Вот так вот: [суперссылка] Но это не сильно радует. В общем-то, мучаюсь (( А остался день :)
Решение второй, которое не проходит по времени:

#include <iostream>
#include <string>
#define inf ( (unsigned short)(-1) )

usingnamespace std;

const int MAX_SIZE = 10010;

unsigned short a[MAX_SIZE][MAX_SIZE];
unsigned short v[MAX_SIZE];
unsigned short intersection[MAX_SIZE];

voidGetMatrixOfLargestCommonSubstring(string s, string t)
{
    for (int j = 0; j <=s.length(); j++)
    {
        a[0][j] = 0;
    }
   
    for (int i = 0; i <= t.length(); i++)
    {
        a[i][0] = 0;
    }
   
    for (int i = 1; i <= t.length(); i++)
    {
        for (int j = 1; j <= s.length(); j++)
        {
            if (t[i-1] == s[j-1])
            {
                a[i][j] = a[i-1][j-1]+1;
            }
            else
            {
                a[i][j] = 0;
            }
        }
    }
}

void GetVectorOfLargestCommonSubstring(int n, int m)
{
    for (int i = 0; i <= n; i++)
    {
        unsigned short maxVal = 0;
        for (int j = 0; j <= m; j++)
        {
            maxVal = max(maxVal, a[j][i]);
        }
        v[i] = maxVal;
    }
}

void Intersect(int len)
{
    for (int i = 0; i <= len; i++)
    {
        intersection[i] = min(v[i], intersection[i]);
    }
}

void FillIntersectionArray()
{
    for (int i = 0; i < MAX_SIZE; i++)
    {
        intersection[i] = inf;
    }
}

int main()
{
    int n;
    cin >> n;
    string s, g;
    cin >> s;

    FillIntersectionArray();

    while (--n)
    {
        cin >> g;
      GetMatrixOfLargestCommonSubstring(s, g);
      GetVectorOfLargestCommonSubstring(s.length(), g.length());
      Intersect(s.length());
    }
   
    unsigned short maxNum = 1;
   
    for (int i = 1; i <= s.length(); i++)
    {
        if (intersection[i] > intersection[maxNum])
        {
            maxNum = i;
        }
    }
   
    string ans(s, maxNum-intersection[maxNum], intersection[maxNum]);

    cout << ans << endl;

}

6 комментариев:

  1. Яндекс офигел-офигел!
    Напишешь всё :*

    ОтветитьУдалить
  2. И убери в настройках капчу... У Валика вот здесь - http://f-low010.blogspot.com/2012/06/blog-post_11.html - написано, как это сделать.

    ОтветитьУдалить