
1 #include <iostream> 2 #include <algorithm> 3 #include <cstring> 4 #include <cstdio> 5 #include <bitset> 6 #include <vector> 7 #include <queue> 8 #include <stack> 9 #include <cmath> 10 #include <list> 11 #include <set> 12 #include <map> 13 #define rep(i,a,b) for(int i = a;i <= b;++ i) 14 #define per(i,a,b) for(int i = a;i >= b;-- i) 15 #define mem(a,b) memset((a),(b),sizeof((a))) 16 #define FIN freopen("in.txt","r",stdin) 17 #define FOUT freopen("out.txt","w",stdout) 18 #define IO ios_base::sync_with_stdio(0),cin.tie(0) 19 #define mid ((l+r)>>1) 20 #define ls (id<<1) 21 #define rs ((id<<1)|1) 22 #define N 1005 23 #define INF 0x3f3f3f3f 24 #define INFF ((1LL<<62)-1) 25 using namespace std; 26 typedef long long LL; 27 typedef pair<int, int> PIR; 28 const int mod = 1e9+7; 29 30 int n, x, lim[30], dp[N], dp1[N]; 31 string s; 32 33 bool judge(int l, int r){ 34 int len = r-l; 35 rep(i, l, r){ 36 if(lim[s[i-1]-'a'] <= len) return false; 37 } 38 return true; 39 } 40 int main() 41 {IO; 42 //FIN; 43 while(cin >> n){ 44 cin >> s; 45 rep(i, 0, 25) { cin >> x; lim[i] = x; } 46 47 mem(dp, 0); 48 mem(dp1, INF); 49 dp1[0] = 0; 50 dp[0] = 1; 51 int maxn = 0, minn = n; 52 rep(i, 1, n){ 53 rep(j, 1, i){ 54 if(judge(j, i)){ 55 dp[i] = (dp[i]%mod+dp[j-1]%mod)%mod; 56 dp1[i] = min(dp1[i], dp1[j-1]+1); 57 if(dp[j-1]) 58 maxn = max(maxn, i-j+1); 59 } 60 } 61 } 62 cout << dp[n] << " " << maxn << " " << dp1[n] << endl; 63 } 64 return 0; 65 }