51NOD 1277 字串中的最大值(KMP)

2022-05-01 13:27:11 字數 1110 閱讀 4568

》點選進入原題測試《

思路:用kmp優化的暴力寫了一遍,超時!沒有充分利用kmp中next陣列的性質。

首先這個題是肯定要用到kmp演算法的,然後會有乙個next陣列。

用乙個陣列來sum[i]表示長度為i的字首的字串有多少個,於是預設所有初始值為1;

然後倒著遞推sum[next[i]]+=sum[i];原理的話自己找個樣例手動模擬一下應該就清楚了,真的是很神奇的乙個規律。

注意使用長整形,有個樣例會溢位!

參照一下帖子 

#include#include

#include

using

namespace

std;

int ne[100010

];void cal_next(string

str)

}int kmp(string str, string

str2)

}return

sum;

}int

main()

cout

<< maxs <

return0;

}

暴力超時**

#include#include

#include

#include

#include

using

namespace

std;

#define ll long longll ne[

100010], sum[100010

];void cal_next(string

str)

}int kmp(string str, string

str2)

}return

sum;

}int

main()

cout

<< maxs <

return0;

}

51Nod1277 字串中的最大值

乙個字串的字首是指包含該字元第乙個字母的連續子串,例如 abcd的所有字首為a,ab,abc,abcd。給出乙個字串s,求其所有字首中,字元長度與出現次數的乘積的最大值。例如 s abababa 所有的字首如下 a 長度與出現次數的乘積 1 4 4,ab 長度與出現次數的乘積 2 3 6,aba 長...

51nod 1277 字串中的最大值

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...

51nod 1277 字串中的最大值

51nod 1277 字串中的最大值 對於單串,考慮多串的fail樹,發現next陣列的關係形成樹形結構 建出next樹,對於每乙個字首,他出現的次數就是他子樹的大小 include include includeinline int read const int maxn 100007 struc...