只得了20分还看不了数据
查看原帖
只得了20分还看不了数据
659653
Chainsure楼主2024/3/24 16:46
#include <iostream>
#include <cstring>
#include <algorithm>
#include <vector>

using namespace std;
typedef pair<int, int> PII;

const int N = 210, M = 10;
string str;
string s[M];
vector<PII> posVec;
int st[N][M][N];
int p, k, q, len, minLen;

void preprocess() {
    for (int i = 0; i < q; ++i) {
        int len = s[i].size();
        for (int j = 0; j + len <= str.size(); ++j) {
            if (str.substr(j, len) == s[i]) {
                posVec.emplace_back(j, j + len - 1);
            }
        }
    }
    sort(posVec.begin(), posVec.end());
}

int cal(int stPos, int edPos) {
    int count = 0;
    for (int i = 0; i < posVec.size();) {
        if (posVec[i].first < stPos) {
            ++i;
            continue;
        }
        int j = i;
        bool flag = false;
        while (j < posVec.size() && posVec[j].first == posVec[i].first) {
            if (posVec[j].second <= edPos && !flag) {
                ++count;
                flag = true;
            }
            ++j;
        }
        i = j;
    }
    return count;
}

int dfs(int curPos, int segIdx, int segLen) {
    auto &t = st[curPos][segIdx][segLen];
    if (t != -1) {
        return t;
    }
    if (segIdx == k - 1) {
        if (curPos + segLen != len) {
            return t = 0; 
        } else {
            return t = cal(curPos, curPos + segLen - 1);
        }
    }
    int cnt = cal(curPos, curPos + segLen - 1);
    int res = cnt;
    int neStPos = curPos + segLen;
    for (int i = 1; neStPos + i + minLen * (k - segIdx - 2) <= len; ++i) {
        res = max(res, cnt + dfs(neStPos, segIdx + 1, i));
    }
    return t = res;
}

int main() {
    cin >> p >> k;
    while (p --) {
        string tmp;
        cin >> tmp;
        str += tmp;
    }
    len = str.size();
    if (len < k) {
        cout << 0 << endl;
        return 0;
    }
    memset(st, -1, sizeof st);
    minLen = 0x3f3f3f3f;
    cin >> q;
    for (int i = 0; i < q; ++i) {
        cin >> s[i];
        minLen = min(minLen, (int)s[i].size());
    }
    preprocess();
    int res = 0;
        for (int i = 1; i + minLen * (k - 1) <= len; ++i) {
        res = max(res, dfs(0, 0, i));
    }
    cout << res << endl;
    return 0;
}
2024/3/24 16:46
加载中...