标签:inf return 长度 gif 技术分享 div 包含 hid scan
题意 : 一个字符串的前缀是指包含该字符第一个字母的连续子串,例如:abcd的所有前缀为a, ab, abc, abcd。给出一个字符串S,求其所有前缀中,字符长度与出现次数的乘积的最大值。例如:S = "abababa" 所有的前缀如下:
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e5 + 10;
const int INF = 0x3f3f3f3f;
char mo[maxn];
int Next[maxn];
long long d[maxn];
int moL;
inline void GetNext()
{
int i = 0, j = -1;
Next[i] = j;
while(i < moL){
while(j!=-1 && mo[i]!=mo[j]) j = Next[j];
Next[++i] = ++j;
}
}
inline void PrintAns()
{
GetNext();
memset(d, 0, sizeof(d));
long long ans = -INF;
for(int i=moL; i>0; i--){
d[i]++;///长度为 i 的前缀出现肯定至少一次
d[Next[i]] += d[i];///对包含在其中的前缀进行值的叠加
ans = max(ans, d[i]*i);///维护更新答案
}
printf("%lld\n", ans);
}
int main(void)
{
scanf("%s", mo);
moL = strlen(mo);
PrintAns();
return 0;
}
瞎 : 类似这种前缀啊!后缀啊!什么求什么和出现次数有关的,就要灵敏一点想到KMP啦!
51Nod 1277 字符串中的最大值 ( KMP && DP )
标签:inf return 长度 gif 技术分享 div 包含 hid scan
原文地址:http://www.cnblogs.com/Rubbishes/p/7577163.html