タイトルリンクします。https://codeforces.com/contest/766/problem/C
タイトル効果は:n個の小文字の文字列の長さを有する文字列を与えられました。それぞれの対応する値が文字列の長さにわたって表示されない愛愛の要求値に対応する文字の元の文字列を分割し、小文字をaiを持っています。分割はどのくらいの、少なくともスプリットタイムを介して後にQ.スプリットありますどのように多くの方法、最も長い列の長さが表示され、各部門の少なくとも数はどのくらいですか?
思考:F [i]は:i番目の文字の最後に、プログラムの分割数。P [i]は:文字列番号の末尾までのi番目の文字のセグメント化方式の数。
#include <bits/stdc++.h>
#define LL long long
using namespace std;
const int mod=1e9+7;
int s[35]={0};
char a[1005];
LL f[1005]={0};
LL p[1005]={0};
int c[1005][27]={0};
int main()
{
int n, M1=1;
scanf("%d", &n);
scanf("%s", a+1);
for(int i=1; i<=26; i++){
scanf("%d", &s[i]);
}
f[0]=1,f[1]=1, p[1]=1, c[1][a[1]-'a'+1]++;
for(int i=2; i<=n; i++){
p[i]=1<<30;
for(int j=1; j<=26; j++){
c[i][j]+=c[i-1][j];
}
c[i][a[i]-'a'+1]++;
for(int j=1; j<=i; j++){
int g=0, Len=i-j+1;
for(int k=1; k<=26; k++){
if(c[i][k]-c[j-1][k]){
if(s[k]<Len){
g=1;
}
}
}
if(!g){
f[i]=(f[i]+f[j-1])%mod;
M1=max(M1, Len);
p[i]=min(p[i], p[j-1]+1);
//cout<<i<<" "<<j<<" "<<f[i]<<endl;
}
}
}
printf("%lld\n%d\n%d\n", f[n], M1, p[n]);
return 0;
}