萌新蒟蒻求助,用的是DP+KMP的思路,但是32分,剩下的点WA找不出问题了
查看原帖
萌新蒟蒻求助,用的是DP+KMP的思路,但是32分,剩下的点WA找不出问题了
828559
longzhanyuye楼主2023/8/26 16:53
#include <iostream>
#include <string>
using namespace std;
string p[200];
int cnt;
int nxt[10][210];
int dp[200010][210];
bool ans[200010];
int main()
{
    // 输入
    string tmp;
    while (cin >> tmp)
    {
        if (tmp == ".")
            break;
        p[cnt] = tmp;
        cnt++;
    }
    string s;
    cin >> s;
    s.insert(0, "."); // 让下标从1开始
    // cout << "input is done" << endl;
    for (int i = 0; i < cnt; i++)
        nxt[i][0] = -1;
    for (int i = 0; i < cnt; i++)
    {
        int t = -1;
        int j = 0;
        while (j <= p[i].size())
        {
            if (0 > t || p[i][j] == p[i][t])
            {
                j++;
                t++;
                nxt[i][j] = t;
            }
            else
                t = nxt[i][t];
        }
    }
    // next表构造完成
    for (int i = 0; i < cnt; i++)
    {
        int q = 1;
        int j = 0;
        while (q < s.size())
        {
            while ((q < s.size()) && (j < 0 || j < p[i].size()))
            {
                if (j < 0 || s[q] == p[i][j])
                {
                    q++;
                    j++;
                }
                else
                    j = nxt[i][j];
            }
            if (j == p[i].size())
            {
                dp[q - p[i].size()][i] = p[i].size();
                j = nxt[i][j];
            }
        }
    }
    // 跑cnt遍kmp,标记每一个匹配位置及匹配的字符串的长度
    ans[0] = 1;
    for (int i = 0; i < s.size(); i++)
    {
        if (ans[i] == 1)
        {
            for (int j = 0; j < cnt; j++)
                ans[i + dp[i + 1][j]] = 1;
        }
    }
    // 计算出哪些前缀是合法的
    for (int i = s.size(); i > 0; i--)
    {
        if (ans[i] == 1)
        {
            cout << i << endl;
            return 0;
        }
    }
    // 输出
    cout << 0;
    return 0;
}

2023/8/26 16:53
加载中...