比赛 2026.1.3 评测结果 AAAAWAAAAAAWWAAAAAAA
题目名称 字符串游戲 最终得分 85
用户昵称 djyqjy 运行时间 3.878 s
代码语言 C++ 内存使用 206.38 MiB
提交时间 2026-01-03 11:30:56
显示代码纯文本
#include<bits/stdc++.h>
#define int long long
#define ll long long
#define pir pair<int,int>
#define fi first
#define se second
#define pb push_back
#define mp make_pair
using namespace std;
inline int re()
{
    int f=1,num=0;
    char c=getchar();
    while(c<'0'||c>'9'){if(c=='-') f=-1;c=getchar();}
    while(c>='0'&&c<='9') num=num*10+c-'0',c=getchar();
    return num*f;
}
int T;
void clear();
const int N=210,M=30,L=20;
int f[N][N],g[N][N][M][L];
int n,m,K;
char s[N],t[M][L];
int slen[M];
int res[N][N];
void work()
{
    clear();
    n=re();m=re();K=re();
    scanf("%s",s+1);
    for(int i=1;i<=m;i++) scanf("%s",t[i]+1),slen[i]=strlen(t[i]+1);
    memset(f,0x3f,sizeof(f));
    memset(g,0x3f,sizeof(g));
    for(int i=1;i<=n;i++) for(int j=1;j<i;j++) f[i][j]=0;
    for(int i=1;i<=n;i++) for(int j=1;j<i;j++) for(int k=1;k<=m;k++) g[i][j][k][0]=0;
    // for(int i=1;i<=n;i++)
    // {
    //     for(int j=1;j<=m;j++) if(t[j][1]==s[i]) g[i][i][j][1]=0;
    // }
    for(int len=1;len<=n;len++)
    {
        for(int l=1;l+len-1<=n;l++)
        {
            int r=l+len-1;
            for(int i=1;i<=m;i++)
            {
                for(int j=1;j<=slen[i];j++)
                {
                    if(s[r]!=t[i][j]) continue;
                    for(int k=l-1;k<r;k++)
                    {
                        g[l][r][i][j]=min(g[l][r][i][j],g[l][k][i][j-1]+f[k+1][r-1]);
                    }
                }
            }
            for(int i=1;i<=m;i++) f[l][r]=min(f[l][r],g[l][r][i][slen[i]]+1);
        }
    }
    // for(int i=1;i<=n;i++) {for(int j=1;j<=n;j++) cout<<f[i][j]<<' ';cout<<endl;}
    memset(res,0x3f,sizeof(res));
    res[0][0]=0;
    for(int i=1;i<=n;i++)
    {
        for(int j=0;j<=K;j++) res[i][j]=res[i-1][j]+1;
        for(int j=0;j<=K;j++)
        {
            for(int k=1;k<=i;k++) if(j>=f[k][i]) res[i][j]=min(res[i][j],res[k-1][j-f[k][i]]);
        }
    }
    int ans=0x3f3f3f3f3f3f3f3f;
    for(int i=0;i<=K;i++) ans=min(ans,res[n][i]);
    printf("%d\n",ans);
    return;
}
signed main()
{
    freopen("string.in","r",stdin);
    freopen("string.out","w",stdout);
    T=1;
    while(T--) work();
    return 0;
}
void clear()
{
    return;
}