描述
小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...