题目 题意:给定一个字符串 s 1 s 2 s 3 . . . s n s_1s_2s_3...s_n s1s2s3...sn,定义它的子串序列为{ s 1 , s 1 s 2 , . . . , s 1 s 2 s 3 . . . s n , s 2 , s 2 s 3 , . . . , s 2 s 3 . . . s n , s 3 , s 3 s 4 , . . . , s n − 1 s n , s n s_1,s_1s_2,...,s_1s_2s_3...s_n,s_2,s_2s_3,...,s_2s_3...s_n,s_3,s_3s_4,...,s_{n-1}s_{n},s_n s1,s1s2,...,s1s2s3...sn,s2,s2s3,...,s2s3...sn,s3,s3s4,...,sn−1sn,sn}。比如字符串 a b c d abcd abcd,它的子串序列为{ a , a b , a b c , a b c d , b , b c , b c d , c , c d , d a,ab,abc,abcd,b,bc,bcd,c,cd,d a,ab,abc,abcd,b,bc,bcd,c,cd,d},求子串序列的最长递增子序列(可以不连续)。 参考 PS:这道题标了2500,但感觉没到这个难度的样子。
思路: 1、前缀字符串一定小于原字符串。 2、预处理,计算原字符串以任意两个位置 i , j i,j i,j为起点的字符串的最长公共前缀。 3、对于以 i i i为起点的字符串,遍历所有起点下标 j j j小于 i i i的字符串,如果以 i i i为起点的字符串 存在比 以 j j j为起点的字符串 的串(有点绕),那么则更新小于 以 i i i为起点的字符串的 子串数量。详见代码。
官方代码(写的挺好的,自己太懒 就不写了_(:з」∠)_)
#include
using namespace std;
int16_t lcp[10000 + 5][10000 + 5];
int dp[10000 + 5];
bool is_greater(const string& s, int x, int y) {
if (lcp[x][y] == static_cast(s.size()) - x) {
return false;
}
return s[x + lcp[x][y]] > s[y + lcp[x][y]];
}
int get_score(const string& s, int x, int y) {
if (is_greater(s, x, y)) {
return dp[y] + static_cast(s.size()) - x - lcp[x][y];
}
return 0;
}
int main() {
int t;
cin >> t;
while (t--) {
int n;
cin >> n;
string s;
cin >> s;
if (s.size() != n) return 42;
for (int i = 0; i = 0; j--) {
if (i == j) {
lcp[i][j] = n - i;
} else
if (s[i] != s[j]) {
lcp[i][j] = 0;
} else {
lcp[i][j] = lcp[i + 1][j + 1] + 1;
}
}
}
int ans = n;
dp[0] = n;
for (int i = 1; i
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?