背單詞,始終是複習英語的重要環節。在荒廢了3年大學生涯後,lele也終於要開始背單詞了。
一天,lele在某本單詞書上看到了乙個根據詞根來背單詞的方法。比如"ab",放在單詞前一般表示"相反,變壞,離去"等。
於是lele想,如果背了n個詞根,那這些詞根到底會不會在單詞裡出現呢。更確切的描述是:長度不超過l,只由小寫字母組成的,至少包含乙個詞根的單詞,一共可能有多少個呢?這裡就不考慮單詞是否有實際意義。
比如一共有2個詞根 aa 和 ab ,則可能存在104個長度不超過3的單詞,分別為
(2個) aa,ab,
(26個)aaa,aab,aac...aaz,
(26個)aba,abb,abc...abz,
(25個)baa,caa,daa...zaa,
(25個)bab,cab,dab...zab。
這個只是很小的情況。而對於其他複雜點的情況,lele實在是數不出來了,現在就請你幫幫他。
input
本題目包含多組資料,請處理到檔案結束。
每組資料佔兩行。
第一行有兩個正整數n和l。(0output
對於每組資料,請在一行裡輸出一共可能的單詞數目。
由於結果可能非常巨大,你只需要輸出單詞總數模2^64的值。
sample input
2 3sample outputaa ab
1 2a
104做這道題之前建議做poj的2778 我們知道2778求的是包含的有多少種 這題要的是不包含的有多少種52
那麼我們就顯而易見可知只要求出所有的方案數減去包含的有多少種 也就是答案了
所以只要求出方案數是 [f(n-1) 1 ] [ 26 0;1 1] = [f(n) 1 ];
也用矩陣快速冪去加速 但是會超時 我們要儲存每一次第一行的價值 所以我們加一列全是1的維度
這樣就能儲存啦 其實可以手推一下 是行得通的
/*
hdoj 2243
*/#include #include #include #include #include using namespace std;
#define dbg(x) ;
struct matrix
matrix(int _n)
return ret;
}matrix pow_m(matrix a,int n)
return ret;
}struct trie
void init()
void insert(char buf)
end[now] = true;
}void build()
while(!q.empty())}}
matrix getmatrix()
for(int i = 0;i < l+1;i++)
ret.mat[i][l] = 1;
return ret;
}void debug()
}};char buf[10];
trie ac;
int main()
ac.build();
matrix a = ac.getmatrix();
a = pow_m(a,l);
unsigned long long res = 0;
dbg(a.n);
for(int i = 0;i < a.n;i++)
res--;
dbg(res);
/** f[n]=1 + 26^1 + 26^2 +...26^n
* f[n]=26*f[n-1]+1
* = [26 0;1 1]
* 數是f[l]-1;
* 此題的l<2^31.矩陣的冪不能是l+1次,否則就超時了
*/a = matrix(2);
a.mat[0][0]=26;
a.mat[1][0] = a.mat[1][1] = 1;
a=pow_m(a,l);
unsigned long long ans=a.mat[1][0]+a.mat[0][0];
ans--;
dbg(ans);
ans-=res;
cout<}
return 0;
}
hdu 2243 考研路茫茫 單詞情結
hdoj 2243 不僅僅是考研路茫茫 a此題的過程也是路茫茫 終於到最後柳暗花明了 a這個題用了3天 或者說用了1個月 因為1個月前就學了kmp和ac自動機 雖然上個月那節課學了kmp匹配演算法 字典樹 ac自動機。當時就聽得一頭霧水 特別是kmp那個失敗指標 或者說成是next fail.有那麼...
Hduoj 2243 考研路茫茫 單詞情結
自動機 dp 快速冪取模 矩陣快速冪。這個題目和poj2778很相似,不過這個是求出包含的有多少個。也就是用總的個數減去不包含的。由於長度是1 l內的,所以我們得把所有的情況都給求出來。首先是求構成單詞的總的個數,也就是 26 1 26 2 26 3 26 l,當然我們可以將其寫成更一般的形式 26...
HDU 2243 考研路茫茫 單詞情結
這道題和poj2778類似都需要利用end陣列和next陣列的特性構建狀態陣列,不過這裡是需要經過至少乙個目標串,而且長度是不小於l的,即需要長度為1 l時的種數和。然後我們可以求出總數後減去不經過目標串的和,剩下的就是我們要的答案。設總數的陣列為f n 當n為1時答案為26,n為2時為26 26 ...