返回顶部

魔族密码

题意

传送门

就是用动态规划找最长的“词链”

如果在一个由一个词或多个词组成的表中,
除了最后一个以外,
每个单词都被其后的一个单词所包含,
即前一个单词是后一个单词的前缀,
则称词表为一个词链。 

思路

C++ 中有一个函数叫做 \(strstr(x, y)\)

即找到 \(y\) 第一次出现在 \(x\) 中的位置,返回 \(y\),找不到返回 \(NULL\)

第一次出现的位置不能保证前缀,所以还要把 \(y\)\(x\) 比较。


int res = strstr(x, y) == x;
cout << res;

上代码段展现了不同长度字符串比较相等自动长度。

也可写成如下

int len = strlen(y);
int res = strstr(x, y) == x.substr(0, len);
// 这里的x y事实上是char数组,substr只是为了更好的理解自动长度
cout << res;

动态规划部分较为简单~

代码

#include <bits/stdc++.h>
using namespace std;
char s[2022][80];
int f[2022];
int n, ans;
int main()
{
    cin >> n;
    for (int i = 1; i <= n; ++i)
    {
        cin >> s[i];
        f[i] = 1;
        for (int j = i - 1; j >= 1; j--) // 二维化一维
            if (strstr(s[i], s[j]) == s[i]) // 长度自动
            // strstr()返回s[i]第一次出现在s[j]中
                f[i] = max(f[j] + 1, f[i]); // 接上去 or 不接
        ans = max(f[i], ans);
    }
    cout << ans;
    return 0;
}

谢谢大家!

posted @ 2022-07-21 13:20  zrc4889  阅读(29)  评论(0)    收藏  举报