Hduoj 2243 考研路茫茫 單詞情結

2021-06-08 15:24:26 字數 1919 閱讀 4422

自動機+dp+快速冪取模+矩陣快速冪。這個題目和poj2778很相似,不過這個是求出包含的有多少個。也就是用總的個數減去不包含的。由於長度是1~l內的,所以我們得把所有的情況都給求出來。首先是求構成單詞的總的個數,也就是:26^1 + 26^2 + 26^3 +....+ 26^l,當然我們可以將其寫成更一般的形式:26*(26^l -1)/25,但是這樣計算有很大的問題,由於取模運算對除法的未定義,我們必須儲存26^l-1的值, 然後在做除法,當l很大的時候26^l很難儲存下來,同時還要用這個很大的數去做除法,很難寫。我們可以就直接按照所給的式子來計算:對於上述的式子,我們是可以採用二分來計算的,舉個例子:26^1+26^2+26^3+26^4+26^5+26^6,這個式子我們可以這樣寫:

26^3(26^1+26^2+26^3)+(26^1+26^2+26^3),然後我們就只需要計算(26^1+26^2+26^3)*(26^3 + 1),這樣我們的計算次數就得到簡化。如此二分計算就可以了。這個題的取模是比較特殊的,由於是對2^64取模,化為二進位制位:取模也就是對於二進位制位在0~63的會儲存下來,而高位就不用管了,因為高與63位的一定是2^64的倍數。所以我們在計算的時候不需要刻意的去做取模運算,因為高位會因儲存不下而溢位,保留的肯定是地位。對於每一種不含給定字元的情況,我們可以像poj2778那樣,先計算出狀態轉移矩陣a,然後就是a + a^2 + a^3 +....+a^l,對於這個式子我們一樣的採用二分的方式,進行快速計算,poj3233就是求這個式子,計算方式一樣。

/*

author: csuchenan

lang: c++

algorithm: ac + dp + martix

*/#include #include #include using namespace std ;

typedef unsigned long long ll ;

struct martix;

martix e_const ;

int next[30][26] ;

int fail[30] ;

bool flag[30] ;

int cnt ;

int n ;

int l ;

void init()

}void insert(char * str)

c = next[c][b] ;

p ++ ;

}flag[c] = 1 ;

}bool read()

return 1 ;

}void build_ac()

else

if(flag [ fail[child] ] )

flag[child] = 1 ;

}else}}

}martix build_martix()

}return e ;

}martix martix_add(martix a , martix b)

}return ans ;

}martix martix_mul(martix a , martix b)

ans.mat[i][j] = sum ;}}

return ans ;

}martix power_martix(martix e , int k)

return ret ;

}martix sum_martix(martix e , int k)

return ans ;

}ll power(ll x , int k )

return ret ;

}ll sum(ll x , int k)

void solve()

ans = total - ans ;

if(ans < 0)

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

}int main()

return 0 ;

}

hdu 2243 考研路茫茫 單詞情結

hdoj 2243 不僅僅是考研路茫茫 a此題的過程也是路茫茫 終於到最後柳暗花明了 a這個題用了3天 或者說用了1個月 因為1個月前就學了kmp和ac自動機 雖然上個月那節課學了kmp匹配演算法 字典樹 ac自動機。當時就聽得一頭霧水 特別是kmp那個失敗指標 或者說成是next fail.有那麼...

HDU 2243 考研路茫茫 單詞情結

這道題和poj2778類似都需要利用end陣列和next陣列的特性構建狀態陣列,不過這裡是需要經過至少乙個目標串,而且長度是不小於l的,即需要長度為1 l時的種數和。然後我們可以求出總數後減去不經過目標串的和,剩下的就是我們要的答案。設總數的陣列為f n 當n為1時答案為26,n為2時為26 26 ...

HDOJ 2243 考研路茫茫 單詞情結

背單詞,始終是複習英語的重要環節。在荒廢了3年大學生涯後,lele也終於要開始背單詞了。一天,lele在某本單詞書上看到了乙個根據詞根來背單詞的方法。比如 ab 放在單詞前一般表示 相反,變壞,離去 等。於是lele想,如果背了n個詞根,那這些詞根到底會不會在單詞裡出現呢。更確切的描述是 長度不超過...