51nod 1277 字串中的最大值 KMP

2021-08-11 16:27:59 字數 1346 閱讀 3236

1277 字串中的最大值

codility

基準時間限制:1 秒 空間限制:131072 kb 分值: 80 

難度:5級演算法題

乙個字串的字首是指包含該字元第乙個字母的連續子串,例如:abcd的所有字首為a, ab, abc, abcd。

給出乙個字串s,求其所有字首中,字元長度與出現次數的乘積的最大值。

例如:s = "abababa" 所有的字首如下:

"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
以前用kmp一直沒有關注next陣列的用法,這道題很好的體現了next陣列的用法。也讓我明白了next陣列所代表的值不僅僅是失配時應該轉移的下標位置,同時也是最大字首-字尾的個數。

思路:先創乙個next陣列,num[i]陣列表示的是長度為i的字首的個數。從最後乙個開始向前搜尋,只要大的範圍出現一次,那麼小的字首匹配的個數就會多一次。根據這個原理,就可以找到所有num[i]。

#include #include #include using namespace std;

const int max_n=100005;

char t[max_n],p[max_n];

int ne[max_n],num[max_n];

void makenext(const char p,int ne)

}int kmp(const char t,const char p,int ne)

}return ans;

}int main()

long long ans=0;

for(int i=1;i<=len;i++)

printf("%lld\n",ans);

}return 0;

}

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