社区讨论

help!!!!90pts

P1026[NOIP 2001 提高组] 统计单词个数参与者 2已保存回复 1

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
1 条
当前快照
1 份
快照标识符
@mhj1lndv
此快照首次捕获于
2025/11/03 19:14
4 个月前
此快照最后确认于
2025/11/03 19:14
4 个月前
查看原帖
CPP
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N = 205;
int p, k, ans = 0, s, n;
char str[N];
int f[N][N];
char w[10][N];
bool t[N];
int cnt(int idx, int l, int r)
{
    int len = r - l - strlen(w[idx] + 1) + 2, res = 0;
    for (int i = 0; i <= len - 1; i++)
    {
        for (int j = 1; j <= strlen(w[idx] + 1); j++)
        {
            if ((w[idx][j] ^ str[l + i + j - 1]) || (t[l + i]))
                break;
            else if (j == strlen(w[idx] + 1))
            {
                res++;
                t[l + i] = true;
            }
        }
    }
    return res;
}
int q(int l, int r)
{
    for (int i = l; i <= r; i++)
        t[i] = false;
    int res = 0;
    for (int i = 1; i <= s; i++)
        if (r - l + 1 >= strlen(w[i] + 1))
            res += cnt(i, l, r);
    return res;
}
void calc()
{
    for (int i = 1; i <= n - 1; i++)
        f[i][1] = q(1, i);
    for (int j = 2; j <= k; j++)
        for (int i = j; i <= n - 1; i++)
            for (int l = j - 1; l <= i - 1; l++)
                f[i][j] = max(f[i][j], f[l][j - 1] + q(l + 1, i));
    for (int i = k; i <= n - k; i++)
        ans = max(ans, f[i][k] + q(i + 1, n));
}
signed main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    cin >> p >> k;
    k--;
    for (int i = 1; i <= p; i++)
        cin >> (str + 20 * (i - 1) + 1);
    n = strlen(str + 1);
    cin >> s;
    for (int i = 1; i <= s; i++)
        cin >> (w[i] + 1);
    calc();
    cout << ans << endl;
    return 0;
}

回复

1 条回复,欢迎继续交流。

正在加载回复...