Submission details
Task:Niitty
Sender:adex720
Submission time:2026-09-15 19:26:50 +0300
Language:C++ (C++20)
Status:COMPILE ERROR

Compiler report

In file included from /usr/include/c++/13/string:43,
                 from /usr/include/c++/13/bitset:52,
                 from /usr/include/x86_64-linux-gnu/c++/13/bits/stdc++.h:52,
                 from input/code.cpp:4:
/usr/include/c++/13/bits/allocator.h: In destructor 'constexpr std::__cxx11::basic_string<char>::_Alloc_hider::~_Alloc_hider()':
/usr/include/c++/13/bits/allocator.h:184:7: error: inlining failed in call to 'always_inline' 'constexpr std::allocator< <template-parameter-1-1> >::~allocator() noexcept [with _Tp = char]': target specific option mismatch
  184 |       ~allocator() _GLIBCXX_NOTHROW { }
      |       ^
In file included from /usr/include/c++/13/string:54:
/usr/include/c++/13/bits/basic_string.h:181:14: note: called from here
  181 |       struct _Alloc_hider : allocator_type // TODO check __is_final
      |              ^~~~~~~~~~~~

Code

#pragma GCC optimize("03")
#pragma GCC target("arch=skylake")

#include <bits/stdc++.h>
using namespace std;

using ll = long long;

int maarat[502][501][26];

int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);

    ll summa = 0ll;
    string s;
    bool kelpo;
    int n, min, max, keski;
    cin >> n;

    int sisaltyvat[26];

    // summataulukon nollaus
    for (int y = 0; y <= n; y++)
    {
        for (int x = 0; x <= n; x++)
        {
            for (int i = 0; i < 26; i++)
            {
                maarat[y][x][i] = 0;
            }
        }
    }

    for (int i = 0; i < 26; i++)
    {
        sisaltyvat[i] = 0;
    }

    // syötteen kukkien merkitseminen
    for (int y = 1; y <= n; y++)
    {
        cin >> s;
        for (int x = 0; x < n; x++)
        {
            maarat[y][x + 1][s[x] - 'A'] = 1;
            sisaltyvat[s[x] - 'A'] = 1;
        }
    }

    // ensimmäisen rivin ja sarakkeen nollaus
    for (int y = 1; y <= n; y++)
    {
        for (int i = 0; i < 26; i++)
        {
            maarat[y][0][i] = sisaltyvat[i] ? maarat[y][0][i] + maarat[y - 1][0][i] : y;
        }
    }
    for (int x = 1; x <= n; x++)
    {
        for (int i = 0; i < 26; i++)
        {
            maarat[0][x][i] = sisaltyvat[i] ? maarat[0][x][i] + maarat[0][x - 1][i] : x;
        }
    }

    // summien lasekminen
    for (int y = 1; y <= n; y++)
    {
        for (int x = 1; x <= n; x++)
        {
            for (int i = 0; i < 26; i++)
            {
                maarat[y][x][i] += maarat[y - 1][x][i] + maarat[y][x - 1][i] - maarat[y - 1][x - 1][i] + 1 - sisaltyvat[i];
            }
        }
    }

    // alin rivi täytyeen hyvin suuria lukuja, jotta tilanteet, joissa mikään korkeus ei ole kelvollinen, käsitellään oikein

    for (int x = 0; x <= n; x++)
    {
        for (int i = 0; i < 26; i++)
        {
            maarat[501][x][i] = INT_MAX;
        }
    }

    // käydään läpi jokainen ruutu, ja lasketaan, monenko mahdollisen alueen vasen yläkulma se on
    for (int alkuY = 0; alkuY < n; alkuY++)
    {
        for (int alkuX = 0; alkuX < n; alkuX++)
        {
            // käydään kaikki leveydet läpi, ja etsitään binäärihaulla minimikorkeus
            max = n;

            for (int loppuX = alkuX; loppuX < n; loppuX++)
            {
                min = alkuY;
                while (max > min)
                {
                    keski = (min + max) >> 1;

                    kelpo = true;
                    for (int c = 0; c < 26; c++)
                    {
                        if (maarat[keski + 1][loppuX + 1][c] - maarat[keski + 1][alkuX][c] - maarat[alkuY][loppuX + 1][c] + maarat[alkuY][alkuX][c] == 0)
                        {
                            kelpo = false;
                            break;
                        }
                    }

                    if (kelpo)
                        max = keski;
                    else
                        min = keski + 1;
                }

                max = min;
                summa += (n - min);
            }
        }
    }

    cout << summa;

    return 0;
}