自動機+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個詞根,那這些詞根到底會不會在單詞裡出現呢。更確切的描述是 長度不超過...