最近学习了 算法。

简单来说, 对于一个字符串 , 定义其 函 数为

由于 十分喜欢河南的各种美食以及河南的队友 (确信), 因此她将字符串 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;
	}
	
}