最近学习了 算法。
简单来说, 对于一个字符串 , 定义其 函 数为
由于 十分喜欢河南的各种美食以及河南的队友 (确信), 因此她将字符串 S 的字符限定在了 四个字母, 相对应地有 。
现在 有一个仅包含 , 四个字母的字符串 且字符串 是一个 环, 想将其分成若干个子串。
形式化地说, 可以选择任意个数个分割点 , 这 个分 割点可以将 分割成 个子串 , 其中 ,
特别地当 时 。
例如 , 分割点为 , 则串 会被分割为 。
将串 分成若干个子串后, 每个子串都有自己的 值。
想知道在不同分割方法下, 所有子串 值之和最大为多少。
输入格式 仅一行, 一个仅包含 四个字母的字符串 。
输出格式 输出仅一行, 包含一个整数, 表示字符串 在不同分割方法下, 所有子串 Hash 值之和的最大值。
样例
input
henan
output
3785504
思路
给一个只包含aehn的字符串T, 找到一种分割方案使得分割出来的字串Hash值之和最大。 暴力枚举的话得是的复杂度, 显然不可能通过。
考虑把环形问题转换为线性问题, 将字符串复制一份延长到末尾。
T: henanhenan
idx: 0123456789
f(i) = max{f(j) + w(j+1,i)} (i-n < j <= i)
#include <iostream>
using namespace std;
const int N = 2e5 +10;
int a[N];
int n;
int F(int i, int j)
{
}
int main()
{
string s;
cin >> s;
s += s;
n = s.size();
for(int i = 0; i < n; i++)
{
if(s[i] == 'a') a[i] = 1;
else if(s[i] == 'e') a[i] = 2;
else if(s[i] == 'h') a[i] = 3;
else if(s[i] == 'n') a[i] = 4;
}
}