Submission #1271810

#TimeUsernameProblemLanguageResultExecution timeMemory
1271810chanhchuong123Anagramistica (COCI21_anagramistica)C++20
110 / 110
15 ms19780 KiB
#include <bits/stdc++.h>
using namespace std;

const int MOD = 1e9 + 7;
const int MAX = 2020;
int n, k;
string s[MAX];
vector<int> a;
int dp[MAX][MAX];
int cnt[MAX][MAX];
map<vector<int>, int> myMap;

void add(int &x, const int &y)
{
    x += y;
    if (x >= MOD)
    {
        x -= MOD;
    }
}

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

    cnt[0][0] = 1;
    for (int i = 1; i <= 2000; ++i)
    {
        cnt[0][i] = cnt[i][i] = 1;
        for (int j = 1; j < i; ++j)
        {
            add(cnt[j][i], cnt[j - 1][i - 1]);
            add(cnt[j][i], cnt[j][i - 1]);
        }
    }

    cin >> n >> k;
    for (int i = 1; i <= n; ++i)
    {
        cin >> s[i];
        vector<int> cnt(26, 0);
        for (char &c : s[i])
            ++cnt[c - 'a'];
        ++myMap[cnt];
    }

    for (auto x : myMap)
        a.push_back(x.second);
    dp[0][0] = 1;
    for (int i = 0; i < int(a.size()); ++i)
    {
        for (int j = 0; j <= k; ++j)
        {
            if (dp[i][j] == 0)
                continue;
            for (int l = 0; l <= a[i]; ++l)
            {
                if (j + l * (l - 1) / 2 > k)
                    break;
                add(dp[i + 1][j + l * (l - 1) / 2], 1LL * dp[i][j] * cnt[l][a[i]] % MOD);
            }
        }
    }
    cout << dp[int(a.size())][k];

    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...