[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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Windows下MySQL安装_Windows环境下用C

    Windows下MySQL安装_Windows环境下用CWindows下MySQL的安装正在更新

    2022年9月14日
    0
  • 手机扫码登录实现思路是什么_扫码登录wifi如何实现

    手机扫码登录实现思路是什么_扫码登录wifi如何实现手机扫码登录实现思路,从业务场景逐个解决问题,引出实现方案

    2022年10月24日
    0
  • todomvc项目_reactive vue

    todomvc项目_reactive vue所有实现代码在文章结尾处分析整个实现过程的步骤:1.显示大标题“todoMVC”在h1中引入{{msg}},在js文件中将msg赋值,从而在html中显示大标签的内容2.当没有数据时,两块模板需要隐藏,用到v-if标签。将两个模板放在一个template标签中,当items.length=0时,则v-if=false,进而两块模板隐藏。3.引入数据。将JS中写好的默认数据引入在html的每一个li标签中。4.将每个事件划分为完成/未完成。该功能用到双向数据绑定,可以在浏览器中vue模

    2022年9月12日
    0
  • 代码触发,手动触发touchstart事件,touch事件,click事件,自定义事件

    代码触发,手动触发touchstart事件,touch事件,click事件,自定义事件代码触发,手动触发touchstart事件,touch事件,click事件,自定义事件

    2022年6月19日
    23
  • conn.setRequestProperty_session.getattribute获取的值为空

    conn.setRequestProperty_session.getattribute获取的值为空问题背景项目中碰到调用其他厂家的接口,厂家不仅提供了接口文档还提供了调用基类,但是使用厂家提供的基类调用其服务确失败。看了源码之后发现是connection.setRequestProperty(“host”,”xxxx”)没有设置成功,导致厂家不能识别到host的值。问题原因一个属性能不能加到request中,由allowRestrictedHeaders和restrictedHeader…

    2022年9月10日
    0
  • bs架构和cs架构_cs bs区别

    bs架构和cs架构_cs bs区别C/S与B/S区别:Client/Server是建立在局域网的基础上的.Browser/Server是建立在广域网的基础上的.1.硬件环境不同:C/S一般建立在专用的网络上,小范围里的网络环境,局域网之间再通过专门服务器提供连接和数据交换服务.B/S建立在广域网之上的,不必是专门的网络硬件环境,例与电话上网,租用设备.信息自己管理.有比C/S更强的适应范围,一般只要有操作系统和浏览器就行2.对安全…

    2022年9月10日
    0

发表回复

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

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