HDU 2296 Ring AC自动机 + DP

题意:给你n个模式串,每个模式串有一个得分,让你构造出一个长度为N之内且分数最高的文本串;输出字典序列最小的。

解题思路:  AC自动机 + DP , 不过要输出字典序列最小,多开一个 一个三维字符串来辅助二维DP(新思路) , DP[i][j] ,表示到i位置状态为j的最大得分。

解题代码:

  1 // File Name: temp.cpp
  2 // Author: darkdream
  3 // Created Time: 2014年09月11日 星期四 15时18分4秒
  4 
  5 #include<vector>
  6 #include<list>
  7 #include<map>
  8 #include<set>
  9 #include<deque>
 10 #include<stack>
 11 #include<bitset>
 12 #include<algorithm>
 13 #include<functional>
 14 #include<numeric>
 15 #include<utility>
 16 #include<sstream>
 17 #include<iostream>
 18 #include<iomanip>
 19 #include<cstdio>
 20 #include<cmath>
 21 #include<cstdlib>
 22 #include<cstring>
 23 #include<ctime>
 24 #include<queue>
 25 #define LL long long
 26 #define maxn 20000
 27 using namespace std;
 28 
 29 int n,m;
 30 char str[55][1110][55];
 31 struct Trie
 32 {
 33     int next[maxn][26],fail[maxn],end[maxn];
 34     int root,L;
 35     int newnode()
 36     {
 37         memset(next[L],-1,sizeof(next[L]));
 38         end[L++] = 0;
 39         return L-1;
 40     }
 41     void init()
 42     {
 43         L = 0;
 44         root = newnode();
 45     }
 46     void insert(char buf[],int id)
 47     {
 48         int len = strlen(buf);
 49         int now = root;
 50         for(int i = 0;i < len ;i++)
 51         {
 52             if(next[now][buf[i]-'a'] == -1)
 53             {
 54                 next[now][buf[i]-'a'] = newnode();
 55             }
 56             now = next[now][buf[i]-'a'];
 57         }
 58         end[now] = id;
 59     }
 60     void build()
 61     {
 62         queue<int>Q;
 63         fail[root] = root;
 64         for(int i = 0;i < 26;i++)
 65             if(next[root][i] == -1)
 66                 next[root][i] = root;
 67             else
 68             {
 69                 fail[next[root][i]] = root;
 70                 Q.push(next[root][i]);
 71             }
 72         while( !Q.empty() )
 73         {
 74             int now = Q.front();
 75             Q.pop();
 76             if(end[fail[now]] == -1)end[now] = -1;
 77             else end[now] |= end[fail[now]];
 78             for(int i = 0;i < 26;i++)
 79                 if(next[now][i] == -1)
 80                     next[now][i] = next[fail[now]][i];
 81                 else
 82                 {
 83                     fail[next[now][i]] = next[fail[now]][i];
 84                     Q.push(next[now][i]);
 85                 }
 86         }
 87     }
 88     int cmp(char str1[],char str2[])
 89     {
 90         if(strlen(str1) < strlen(str2))
 91         {
 92             return 1; 
 93         }else if(strlen(str1) > strlen(str2)){
 94             return 0 ;
 95         }else{
 96             if(strcmp(str1,str2) < 0)
 97                 return 1;
 98         }
 99         return 0;
100     }
101     int dp[100][maxn];
102     void solve()
103     {
104         memset(dp,-1,sizeof(dp));
105         dp[0][0] = 0 ; 
106         int ai = 0 ; 
107         int aj = 0 ;
108         int mx = 0;
109         char tmp[55];
110         char ans[55];
111         strcpy(ans,"");
112         strcpy(str[0][0],"");
113         for(int i = 0 ;i < n;i ++)
114         {
115             for(int j =0 ;j < L ;j ++)
116             {
117                 if(dp[i][j] != -1 )
118                 {
119                     strcpy(tmp,str[i][j]);
120                     int len = strlen(str[i][j]);
121 
122                     for(int s = 0 ;s < 26 ;s ++)
123                     {
124                         int nex = next[j][s];
125                         tmp[len] = 'a' + s;
126                         tmp[len + 1] = 0;
127                         int tt = dp[i][j];
128 
129                         if(end[nex] != -1)
130                             tt += end[nex];
131 
132                         if(tt > dp[i+1][nex] ||(tt == dp[i+1][nex] && cmp(tmp,str[i+1][nex]) ))
133                         {
134                             dp[i+1][nex] = tt;
135                             strcpy(str[i+1][nex],tmp);
136                             if(tt > mx ||(tt == mx && cmp(tmp,ans)))
137                             {
138                                 mx = tt; 
139                                 strcpy(ans,tmp);
140                                 //printf("%s %d\n",ans,mx);
141                             }
142                         }
143                     }
144                 }
145             }
146         }
147         printf("%s\n",ans);
148     }
149 
150 };
151 
152 Trie ac;
153 char tstr[205][20];
154 int main(){
155     int t; 
156     scanf("%d",&t);
157     while(t--)
158     {
159         scanf("%d %d",&n,&m);
160         ac.init();
161         for(int i = 1;i <= m ;i ++ )
162         {
163             scanf("%s",tstr[i]);
164         }
165         int temp ; 
166         for(int i = 1; i <= m;i ++)
167         {
168             scanf("%d",&temp);
169             ac.insert(tstr[i],temp) ;  
170         }
171         ac.build();
172         ac.solve();
173     }
174     return 0;
175 }
View Code

 

转载于:https://www.cnblogs.com/zyue/p/3976079.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/432319.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Modern OpenGL】转换 Transformations

说明&#xff1a;跟着learnopengl的内容学习&#xff0c;不是纯翻译&#xff0c;只是自己整理记录。 强烈推荐原文&#xff0c;无论是内容还是排版。 原文链接 本文地址&#xff1a; http://blog.csdn.net/aganlengzi/article/details/50421159 转换 Transformations 我们已经…

android studio adb 命令行,Android Studio如何配置adb以及经常使用命令

用Android Studio一年多了&#xff0c;都没有使用其调试adb,今天就分享adb配置的方法&#xff0c;分享给你们.android直接打开电脑-属性-高级配置-环境变量。web这里我用图示范给你们&#xff1a;sql这样经常使用adb就配置成功。shell紧接着还有平时经常使用的adb命令&#xff…

【Modern OpenGL】坐标系统 Coordinate Systems

说明&#xff1a;跟着learnopengl的内容学习&#xff0c;不是纯翻译&#xff0c;只是自己整理记录。 强烈推荐原文&#xff0c;无论是内容还是排版。 原文链接 本文地址&#xff1a; http://blog.csdn.net/aganlengzi/article/details/50448453 坐标系统 Coordinate Systems 在…

【Modern OpenGL】摄像机系统 Camera

说明&#xff1a;跟着learnopengl的内容学习&#xff0c;不是纯翻译&#xff0c;只是自己整理记录。 强烈推荐原文&#xff0c;无论是内容还是排版。 原文链接 本文地址&#xff1a;http://blog.csdn.net/aganlengzi/article/details/50448469 摄像机 Camera 在前面的教程中…

UE MATH

1. 求两点的单位向量

材质

1. 随摄像机变化的镜面放射效果 2. 给物体表面增加抛光度 3. 菲涅耳透镜效果

html keyup事件,jquery keyup事件为什么不执行?

先指出你的一个错误点$(#skillKey).on(click, tr, function () {$(this).css(color,red);$(this).keyup(function(){alert(123)});});你这样绑定事件&#xff0c;结果是点击一次tr绑定一次&#xff0c;点了多少次就绑定了多少次&#xff0c;这个例子还是不明显&#xff0c;你在…

cable

1. 建立一个actor&#xff0c;添加一个cable, 然后添加两个mesh作为cable的两个端点 2. 在编辑器中只能设置cable终点attach的mesh和mesh的socket, 因此需要在actor的构成函数里手动的设置 cable起点attach的mesh和socket

Android-将切换tabs的指示器合并到ActionBar上

最近比较忙&#xff0c;好久没更新过博客。国庆第一天没回家&#xff0c;闲下来可以把之前就想贴上来的东西写一下。 使用过Smooth和Fuubo这两个优秀的第三方微博客户端的同学应该见过他们的主页UI&#xff0c;如下图&#xff1a; 他们把切换tabs的指示器放在了ActionBar上&…

html5教学文档笔记,4.HTML 教程- (HTML5 基础)

HTML 教程- (HTML5 基础)1.HTML 标题HTML 标题(Heading)是通过- 标签来定义的.2.HTML 段落HTML 段落是通过标签 来定义的.3.HTML 链接HTML 链接是通过标签 来定义的.提示:在 href 属性中指定链接的地址。菜鸟教程(runoob.com)这是一个链接使用了 href 属性这是一个链接使用了 …

虚幻4渲染系统结构解析

本文根据小米互娱 VR 技术专家 房燕良在 MDCC 2016 移动开发者大会上的演讲整理而成&#xff0c;PPT 下载地址&#xff1a;http://download.csdn.net/detail/sinat_14921509/9639244。 小米互娱 VR 技术专家 房燕良 房燕良&#xff0c;从 2001 年开始&#xff0c;自主研发 3 代…

Windows FFMPEG开发环境配置

1.去FFMPEG网站上下载Dev版本的库&#xff0c;里面有我们需要的头文件和lib文件&#xff0c;然后下载Shared版本的库&#xff0c;里面有我们需要的dll文件 http://ffmpeg.zeranoe.com/builds/ 记得区分32位和64位的库&#xff0c;这里碰到一个大坑&#xff0c;就是我下载的是6…

Ant命令行操作

Ant命令行操作 Ant构建文件可以将项目编译&#xff0c;打包&#xff0c;測试&#xff0c;它是Apache软件基金会jakarta文件夹中的一个子项目&#xff0c;具有跨平台性&#xff0c;操作简单&#xff0c;并且非常easy上手。 关于Ant执行&#xff0c;能够在项目中找到build.xml直接…

在vlan2用计算机名访问,计算机是如何访问一个网页的?vlan间如何实现通信?

昨天我们发布了关于一文讲弄懂什么是vlan、三层交换机、网关、子网掩码&#xff0c;有很多朋友问到关于网络通信的原理&#xff0c;今天我们这一篇文章&#xff0c;算是对昨天文章进行一个补充。首先我们要访问互联网&#xff0c;必须自己电脑上面有ip地址、子网掩码、网关、dn…

使用ffmpeg将BMP图片编码为x264视频文件,将H264视频保存为BMP图片,yuv视频文件保存为图片的代码

ffmpeg开源库&#xff0c;实现将bmp格式的图片编码成x264文件&#xff0c;并将编码好的H264文件解码保存为BMP文件。 实现将视频文件yuv格式保存的图片格式的测试&#xff0c;图像格式png,jpg, gif等等测试均OK 自己根据博客的代码&#xff0c;vs2010搭建的测试环境。资源下载…

川职院单招计算机考什么专业,四川单招考什么科目

2021年高职单招升学一对一咨询小艺老师:18290437291(微信)四川单招考什么科目2019年四川单招考试科目是什么&#xff0c;四川单招考试大概在几月份&#xff1f;四川单招考试都考什么内容&#xff0c;考试会不会很难&#xff1f;不同高校四川单招时间是不同的&#xff0c;一般都…

PHP编写命令行脚本和后台运行程序的注意事项

在一些场合(如开发,测试), 可能需要使用PHP编写一些命令行的处理脚本,或者是长时间后台运行的任务, 需要注意以下准则: 准则1. 尽量避免使用PHP编写后台运行程序, 尤其是类似while(true){….} 这种循环的处理脚本. 比如,有时候我们需要定期检查数据库,然后有数据进行处理,没有数…

通过live555实现H264 RTSP直播

前面的文章中介绍了《H264视频通过RTMP流直播》&#xff0c;下面将介绍一下如何将H264实时视频通过RTSP直播。 实现思路是将视频流发送给live555, 由live555来实现H264数据流直播。 视频采集模块通过FIFO队列将H264数据帧发送给live555. live555 在收到客户端的RTSP播放请求后&…