1 条题解

  • 0
    @ 2026-5-4 13:02:43
    #include<bits/stdc++.h>
    using namespace std;
    const int N=1e3+10;
    int ch[N][26],pre[N],ed[N],len;char st[N];
    void ins(char s[])
    {
    	int n=strlen(s+1),p=0;
    	for(int i=1;i<=n;i++)
    	{
    		int j=s[i]-'A';
    		if(!ch[p][j])ch[p][j]=++len;
    		p=ch[p][j];
    	}
    	ed[p]++;
    }
    void build()
    {
    	deque<int>q;
    	for(int i=0;i<26;i++)if(ch[0][i])q.push_back(ch[0][i]);
    	while(!q.empty())
    	{
    		int x=q.front();q.pop_front();
    		for(int j=0;j<26;j++)
    		{
    			int y=ch[x][j];
    			if(!y)ch[x][j]=ch[pre[x]][j];
    			else pre[y]=ch[pre[x]][j],q.push_back(y);
    		}
    	}
    }
    int dp[N][N];
    signed main()
    {
    	int n,kk;cin>>n>>kk;
    	for(int i=1;i<=n;i++)
    	{
    		scanf("%s",st+1);
    		ins(st);
    	}
    	build();
    	memset(dp,-1,sizeof(dp));dp[0][0]=0;
    	for(int i=0;i<=kk;i++)for(int j=0;j<=len;j++)if(dp[i][j]!=-1)
    	{
    		int p=j;
    		for(int k=p;k;k=pre[k])dp[i][j]+=ed[k];
    		for(int k=0;k<=2;k++)
    		{
    			int id=ch[p][k];
    			dp[i+1][id]=max(dp[i+1][id],dp[i][j]);
    		}
    	}
    //	for(int i=0;i<=kk;i++){for(int j=0;j<=len;j++)cout<<dp[i][j]<<' ';cout<<'\n';}
    	int ans=0;
    	for(int i=0;i<=len;i++)ans=max(ans,dp[kk][i]);
    	cout<<ans;
    	return 0;
    }
    • 1

    信息

    ID
    2099
    时间
    1000ms
    内存
    128MiB
    难度
    10
    标签
    递交数
    1
    已通过
    1
    上传者