Div2 500 EllysPlaylists
問題
3文字以上の,文字列の集合(文字列全体が同じものは無い)が与えられている.その中から重複を含めて K 個抽出して並べるパターンは(mod 1000000007で)何通りあるか.
ただし,並べた順が s0, s1, …, sK-1 のとき,si の末尾3文字は si+1 の頭3文字と一致していなくてはならない.
考え方
DPってやつ?をやれば大丈夫.つまり各文字列スタートで k 個並べるパターンの数を数えて,k+1 個のときにどうなる,ということを k=1..K で計算する.
コード
#include <vector> #include <string> using namespace std; typedef long long lint; const lint MOD = 1000000007LL; class EllysPlaylists { public: int countPlaylists(vector <string> songs, int K) { const int N = songs.size(); vector< vector<bool> > cont(N, vector<bool>(N, false) ); for( int i = 0 ; i < N ; ++i ) { string end = songs[i].substr(songs[i].size()-3); for( int j = 0 ; j < N ; ++j ) { if( end == songs[j].substr(0, 3) ) { cont[i][j] = true; } } } vector<lint> cnt(N, 1); for( int k = 1 ; k < K ; ++k ) { vector<lint> nxt(N, 0); for( int i = 0 ; i < N ; ++i ) { lint c = 0; for( int j = 0 ; j < N ; ++j ) { if( cont[i][j] ) { c = (c + cnt[j]) % MOD; } } nxt[i] = c; } cnt = nxt; } lint sum = 0; for( int i = 0 ; i < N ; ++i ) sum = (sum + cnt[i]) % MOD; return sum; } };