Разделительные +766 C. Codeforces Махмуд и др струна сообщение

Название ссылка: https: //codeforces.com/contest/766/problem/C
Название эффекта: Задана строка из букв , имеющих длину п строчной строки. Каждый из них имеет соответствующее значение д.в. строчную, разделить исходную строку символов , соответствующих требуемому значению д.в. д.в. не появляются по всей длине строки. Q. Сколько существует способов раскола, длина самой длинной подстроки будет появляться после раскола, сколько, по крайней мере , как раз раскол, по крайней мере , число делений, сколько?

Мышление: е [я]: число деления программ до конца я-го символа. р [я]: число я-й схема сегментации символов до конца номера строки.

#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;
}
Опубликовано 374 оригинальные статьи · вона похвала 22 · просмотров 20000 +

рекомендация

отblog.csdn.net/qq_21433411/article/details/103215896