「a」, 長度與出現次數的乘積 1 * 4 = 4,
「ab」,長度與出現次數的乘積 2 * 3 = 6,
「aba」, 長度與出現次數的乘積 3 * 3 = 9,
「abab」, 長度與出現次數的乘積 4 * 2 = 8,
「ababa」, 長度與出現次數的乘積 5 * 2 = 10,
「ababab」, 長度與出現次數的乘積 6 * 1 = 6,
「abababa」, 長度與出現次數的乘積 7 * 1 = 7.
其中」ababa」出現了2次,二者的乘積為10,是所有字首中最大的。
input
輸入字串s, (1 <= l <= 100000, l為字串的長度),s中的所有字元均為小寫英文本母。
output
輸出所有字首中字元長度與出現次數的乘積的最大值。
input示例
abababa
output示例
10其中,r[maxn]在記錄次數的時候特別巧妙,比如r[i]++上,倒敘第一次出現的子序在i的位置上加一,而在r[next[i]]+=r[i]上是記錄這個子序上的最長字首與最長字尾相等的長度上的字首串的出現次數,這裡有乙個問題,就是當碰到abababa串的時候,此時i=7,r[7]++後,r[next[7]]記下的是這個子序上的最長字首與最長字尾相等的長度的字尾串為的是避免在r[i]++上有重複。這相當於dp使用!!
#include
#include
using
namespace
std;
const
int maxn=100010;
char x[maxn];
int next[maxn];
int r[maxn];
void kmpnext(int l)
}int main()
long
long ans=0;
for(long
long i=1;i<=l;i++)ans=max(ans,r[i]*i);
cout
0;}
51Nod1277 字串中的最大值
乙個字串的字首是指包含該字元第乙個字母的連續子串,例如 abcd的所有字首為a,ab,abc,abcd。給出乙個字串s,求其所有字首中,字元長度與出現次數的乘積的最大值。例如 s abababa 所有的字首如下 a 長度與出現次數的乘積 1 4 4,ab 長度與出現次數的乘積 2 3 6,aba 長...
51nod 1277 字串中的最大值
51nod 1277 字串中的最大值 對於單串,考慮多串的fail樹,發現next陣列的關係形成樹形結構 建出next樹,對於每乙個字首,他出現的次數就是他子樹的大小 include include includeinline int read const int maxn 100007 struc...
51nod1277 字串中的最大值(KMP)
1277 字串中的最大值 codility 基準時間限制 1 秒 空間限制 131072 kb 分值 80 難度 5級演算法題 乙個字串的字首是指包含該字元第乙個字母的連續子串,例如 abcd的所有字首為a,ab,abc,abcd。給出乙個字串s,求其所有字首中,字元長度與出現次數的乘積的最大值。例...