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画布demo,Android开发画板demo前奏

目的完成画板demo的前期步骤相关技术、及其使用xml配置文件&#xff1a;创建SeekBar比较简单&#xff0c;但是不足之处在于当实现横屏的时候就比较麻烦代码创建&#xff1a;代码创建SeekBar比较简单&#xff0c;能够很好地实现横竖屏切换。2、创建Slider类继承于View初始化线条…

网站开发和企业级开发有什么区别?

经常看到Web开发、网站开发、企业级开发&#xff0c;以前很难分清楚它们之前有什么不同&#xff1f;以前也有个说法&#xff1a;Java比较适合企业级开发。现在经验增加了一点&#xff0c;谈谈我的一点看法。Web开发&#xff1a;www访问的网页、网站&#xff0c;BS模式。 网站…

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 在…

cocos2d-x 旅程開始--(实现单击与长按)

小菜鸟一枚&#xff0c;学习cocos2d-x已经有一段时间了&#xff0c;感觉进度非常慢那&#xff0c;CSDN也再次拾了起来。近期自己还在学习做小游戏&#xff0c;跟着前辈做了《忍者打怪物》的小游戏&#xff0c;又学习了瓦片游戏《吃西瓜》&#xff0c;打算自个做个坦克大战&…

Android判断view在屏幕可见,如何检查TextView是否在Android可见屏幕内

我想知道我的textview是否在可见的屏幕区域内.但似乎没有什么对我有用.我以前检查过的代码是Rect rect new Rect();//textview intialized in onCreate as text1text1.getHitRect(rect);text1.measure(0, 0);//layout is the parent layout (linear) in which i am adding the…

【Modern OpenGL】摄像机系统 Camera

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

jQuery操作cookie

First of all&#xff0c;引用jq的一个插件jquery.cookie.js 1<span style"font-size:14px">$.cookie(’the_cookie’, ‘the_value’); //新建cookie2 $.cookie(’the_cookie’, null); //删除一个cookie</span><span style"font-size:14px&quo…

linux ntp时间同步

一、搭建时间同步服务器1、编译安装ntp serverrpm -qa | grep ntp若没有找到&#xff0c;则说明没有安装ntp包&#xff0c;从光盘上找到ntp包&#xff0c;使用rpm -Uvh ntp***.rpm进行安装2、修改ntp.conf配置文件vi /etc/ntp.conf①、第一种配置&#xff1a;允许任何IP的客户机…

android jni release,Android NDK 设置编译模式debug和release

原文&#xff1a;http://stackoverflow.com/questions/14564918/android-ndk-release-buildUnless you have created the Application.mk or defined your application as debuggable inside the AndroidManifest.xml you dont have to do anything because by default the app…

android setimageresource取list的,Java ImageView.setImageTintList方法代码示例

import android.widget.ImageView; //导入方法依赖的package包/类public static void show(Context context, CharSequence charSequence, int type) {View layout;if (toast null) {toast Toast.makeText(context, "", Toast.LENGTH_SHORT);initToast(toast);layo…

MFC之CAsyncSocket详解

CAsyncSocket类是从Object类派生而来。CAsyncSocket对象称为异步套接字对象 使用CAsyncSocket进行网络编程&#xff0c;可以充分利用Windows操作系统提供的消息驱动机制&#xff0c;通过应用程序框架来传递消息&#xff0c;方便地处理各种网络事件。另一方面&#xff0c;作为M…

codevs1040 统计单词个数

题目描述 Description给出一个长度不超过200的由小写英文字母组成的字母串(约定;该字串以每行20个字母的方式输入&#xff0c;且保证每行一定为20个)。要求将此字母串分成k份(1<k<40)&#xff0c;且每份中包含的单词个数加起来总数最大(每份中包含的单词可以部分重叠。当…

UE MATH

1. 求两点的单位向量

root 密码丢失后的重新设置

/usr/local/mysql/bin/mysqld_safe --skip-grant-tables & mysql> use mysql; mysql> update user set passwordPASSWORD("root") where userroot;service mysqld stop; service mysqld start;/usr/local/mysql/bin/mysql -u root -p 转载于:https://w…

yum安装git

此方法对于RHEL、Fedora、CentOS有效&#xff1a; 1.yum install git 2.yum istall git-svn git-email git-gui gitk 转载于:https://www.cnblogs.com/moqiang02/p/4061129.html

材质

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

Metasploit Framework命令汇总

一、msfconsole ? 帮助菜单back 从当前环境返回banner 显示一个MSF bannercd 切换目录color 颜色转换connect 连接一个主机exit 退出MSFhelp 帮助菜单info 显示一个或多个模块的信息irb 进入irb脚本模式jobs 显示和管理作业kill 杀死一个作业load 加载一个插件loadpath 在一个…