統計每個長度 出現的最多次數 字尾自動機 板子

2021-08-08 03:02:19 字數 2364 閱讀 8579

描述

小hi平時的一大興趣愛好就是演奏鋼琴。我們知道乙個**旋律被表示為一段數構成的數列。

現在小hi想知道一部作品中所有長度為k的旋律中出現次數最多的旋律的出現次數。但是k不是固定的,小hi想知道對於所有的k的答案。

解題方法提示

輸入共一行,包含乙個由小寫字母構成的字串s。字串長度不超過 1000000。

輸出共length(s)行,每行乙個整數,表示答案。

樣例輸入

aab

樣例輸出

2 1

1

#define _crt_secure_no_warnings

#include

#include

#include// strlen

#include

#include

#include

#include

#include

#include// int_max

#include

#include

#include

using

namespace

std;

const

int maxn = 1e6+3;

typedef

long

long ll;

// sam: suffix auto machine

// 字尾自動機

int next_free_idx = 0;

int maxlen[2*maxn+10], minlen[2*maxn+10], trans[2*maxn+10][26], slink[2*maxn+10]; //每add乙個字元最少增加1個,最多增加兩個狀態

int edpts[2*maxn+10],indegree[2*maxn+10], containprefix[2*maxn+10];

int new_state( int _maxlen, int _minlen, int* _trans, int _slink)

slink[next_free_idx] = _slink;

return next_free_idx++;

}void add_src()

int add_char( char ch, int u )

if( v==-1 )

int x = trans[v][c];

if( maxlen[v]+1 == maxlen[x] )只是乙個子集

// x能代表更廣泛(長度也就可以更長)的字串,如果滿足maxlen[v]+1 == maxlen[x],則v中的子串+ch就恰好與x中的子串一一對應

// 此時 x 代表的結束位置就是

minlen[z] = maxlen[x]+1;

slink[z] = x; indegree[x]++;

return z;

}// 拆分x: x包含一連串連續的子串,將大於maxlen[y]+1的那些(仍然分配到x)和餘下的(分配到y)分別拆分到x和y兩個狀態下

// 那些能夠通過ch轉移到原來的x狀態的所有狀態中,某些要重新指向y,因為suffix-link和狀態機的性質,很容易實現。

// 同時 y 需要拷貝乙份原來x狀態的轉移函式,見new_state();

int y = new_state(maxlen[v]+1, minlen[x]/*-1*/, trans[x], slink[x]);

//slink[y] = slink[x]; // new_state中已賦值

minlen[x] = maxlen[y]+1; // = maxlen[v]+2 ; 拆分後,x包含的最短字串和y包含的最長字串需要更新

slink[x] = y; indegree[y]++;

minlen[z] = maxlen[y]+1;

slink[z] = y; indegree[y]++;

int w = v;

while( w!=-1 && trans[w][c]==x )

//minlen[y] = maxlen[slink[y]]+1; //y的最短不就是原來x的最短了? new_state中賦值

return z;

}

void getendptcount()

while( !q.empty() )

}int ans[maxn*2+10];

char str[maxn];

int main()

int mm(0);

for( int i(next_free_idx-1); i > 0 ; i-- )

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

return

0;

}

統計單詞出現的最多次數(Trie樹)

time limit 60ms memory limit 65536k 有疑問?點這裡 給出n 1 n n 2 10 6 個字串,每個字串只包含小寫英文本母,且最多有五個。問這n個字串中出現次數最多的有多少個。單組輸入。第一行輸入乙個數字n,接下來n行,每行包含乙個字串。輸出乙個數字代表答案。5 a...

統計單詞出現的最多次數(Trie樹)

time limit 60ms memory limit 65536k 有疑問?點這裡 給出n 1 n n 2 10 6 個字串,每乙個字串僅僅包括小寫英文本母,且最多有五個。問這n個字串 現次數最多的有多少個。單組輸入。第一行輸入乙個數字n。接下來n行,每行包括乙個字串。輸出乙個數字代表答案。5 ...

Python統計日誌中每個IP出現次數

介紹了python統計日誌中每個ip出現次數的方法,例項分析了python基於正規表示式解析日誌檔案的相關技巧,需要的朋友可以參考下 本指令碼可用於多種日誌型別 coding utf 8 import re,time defmail log file path global count log op...