[USACO12JAN]视频游戏的连击Video Game Combos「建议收藏」

很早之前就做过啦补一下题解F(i,j)前i个的字符为j的匹配注意end要累加#include<iostream>#include<cstdio>#include<cstring>#include<cmath>#include<algorithm>#include<queue>usingnam…

大家好,又见面了,我是你们的朋友全栈君。

[USACO12JAN]视频游戏的连击Video Game Combos「建议收藏」

 

很早之前就做过啦

补一下题解

F(i,j)前i个的字符为j的匹配

注意end要累加

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<queue>
using namespace std;
const int N=1e5+100;
int n,m;
struct AC_AUTO{
    struct Node{
        int vis[26];
        int fail;
        int end;
    }AC[N];
    int cnt;
    inline void Clear(int p){
        memset(AC[p].vis,0,sizeof(AC[p].vis));
        AC[p].end=0;
        AC[p].fail=0;
    }
    inline void Build(string S){
        int R=S.length();
        int now=0;
        for(int i=0;i<R;i++){
            if(!AC[now].vis[S[i]-'A']){
                cnt++;
                Clear(cnt);
                AC[now].vis[S[i]-'A']=cnt;
            }
            now=AC[now].vis[S[i]-'A'];
        }
        AC[now].end++;
    }
    inline void Get_Fail(){
        queue<int> Q;
        for(int i=0;i<3;i++){
            if(AC[0].vis[i]){
                AC[AC[0].vis[i]].fail=0;
                Q.push(AC[0].vis[i]);
            }
        }
        while(!Q.empty()){
            int x=Q.front();
//			cout<<x<<" ";
            Q.pop();
            for(int i=0;i<3;i++){
                if(AC[x].vis[i]){
                    AC[AC[x].vis[i]].fail=AC[AC[x].fail].vis[i];	
                    Q.push(AC[x].vis[i]);
                }
                else AC[x].vis[i]=AC[AC[x].fail].vis[i];
            }
            AC[x].end+=AC[AC[x].fail].end;
//			cout<<AC[x].end<<'\n';
        }
    }
    int f[1001][1001];
    inline void DP(){
        int ans=0;
        memset(f,-1,sizeof(f));
        f[0][0]=0;
        for(int i=1;i<=m;i++){
            for(int j=0;j<=cnt;j++){
                if(f[i-1][j]==-1)continue;
                for(int k=0;k<3;k++){
                    f[i][AC[j].vis[k]]=max(f[i][AC[j].vis[k]],f[i-1][j]+AC[AC[j].vis[k]].end);
                }
            }
        }
        for(int i=0;i<=cnt;i++){
            ans=max(ans,f[m][i]);
        }
        cout<<ans;
    }
}ACM;
int main(){
//	freopen("3119.in","r",stdin);
    cin>>n>>m;
    for(int i=1;i<=n;i++){
        string s;
        cin>>s;
        ACM.Build(s);
    }
    ACM.Get_Fail();
    ACM.DP();
}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/127721.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长

相关推荐

  • 深度信念网络DBN的一个matlab实例「建议收藏」

    关于深度学习的一些个人浅见:   深度学习通常是训练深度(多层)神经网络,用于模式识别(如语音、图像识别);深度网络指是具有深层(多层)网络结构的神经网络。   深层网络由于神经元多,参数多,拟合表现能力强,有表现欲解决复杂问题的能力。   但是深度网络存在很多局部最优解,深度网络的训练容易停留在局部最优上,初始参数的选择对网络最终收敛在那个位置有很大的影响。

    2022年4月12日
  • PS2手柄通讯协议解析 Stm32

    PS2手柄通讯协议解析 Stm32PS2手柄通讯协议解析—附资料和源码

    2022年5月23日
  • matlab 医学图像处理(matlab进行图像处理)

    对图像文件增加椒盐噪声,然后进行中值滤波Y=imread(‘D:\321.jpg’);%读入图像I=rgb2gray(Y);%转换成灰度图J=imnoise(I,‘salt&pepper’,0.02);%给图像添加椒盐噪声K=medfilt2(J);%对增加噪声后的图像进行中值滤波subplot(2,2,1);imshow(I);title(‘原图’);%显示图像,并…

    2022年4月18日
  • 浅谈软件性能提升相关的概念

    浅谈软件性能提升相关的概念浅谈软件性能提升相关的概念原文链接为<Makingyourprogramrunfaster:thekeyconceptsofsoftwareperformance-Jo

    2022年7月3日
  • 递归算法一般需要利用栈实现_递归算法的结构

    递归算法一般需要利用栈实现_递归算法的结构一、计算器的计算思路分析我们以计算3+8*2-6这个算式为例:将算式解析为数字和符号:3,+,8,*,2,-,6准备一个用于存放数字的数字栈numStack,还有一个存放运算符号的符号栈symb

    2022年8月16日
  • Android SDK下载安装及环境配置

    Android SDK下载安装及环境配置前面两步,我们已经配置了JDK变量环境,并安装好了Eclipse,通过这两步之后Java的开发环境就准备好了,如果我们只是开发普通的JAVA应用程序的话,那么到这里就可以了。但如果我们要通过Eclip

    2022年7月2日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号