魔族密码
题意
就是用动态规划找最长的“词链”
如果在一个由一个词或多个词组成的表中,
除了最后一个以外,
每个单词都被其后的一个单词所包含,
即前一个单词是后一个单词的前缀,
则称词表为一个词链。
思路
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;
}
谢谢大家!

浙公网安备 33010602011771号