天下一予選B B - エターナルスタティックファイナル
解法
dp[文字数] := 覚えている呪文全てを考慮したとき、新しい呪文の先頭から文字数分の文字列を生成する場合数
反省
自分で文字を決めるとき、 N, M とかだと字面が似てて間違えやすい。本番は以下の NEWSIZE を M と書いていて、そのバグで詰まっていた。
#include <bits/stdc++.h> using namespace std; typedef long long ll; #define rep(i,n) for(int i=0;i<n;i++) #define MOD (1000000007) int main() { ll dp[1010] = {}; int N; cin >> N; int NEWSIZE; string NEW; cin >> NEW; NEWSIZE = NEW.size(); vector<string> vec(N); rep(i, N) { cin >> vec[i]; } dp[0] = 1; rep(i, NEWSIZE) { rep(j, N) { int const ssize = vec[j].size(); if(i+ssize > NEWSIZE) continue; if(string(NEW.begin()+i, NEW.begin()+i+ssize) == vec[j]) { (dp[i+ssize] += dp[i]) %= MOD; } } } cout << dp[NEWSIZE]%MOD << endl; return 0; }