SPOJ 7758. Growing Strings AC自动机DP
题目:给出n个字符串,问最多能够选出多少个串组成序列,并满足前一个字符串是后一个字符串的子串。
分析:
AC自动机经典水题。。。
考虑每个节点结尾时,他能够选出最多的串 = max{ 父节点选出 , fail节点选出 }+以该节点为结尾的单词个数
- #include <set>
- #include <map>
- #include <list>
- #include <cmath>
- #include <queue>
- #include <stack>
- #include <string>
- #include <vector>
- #include <cstdio>
- #include <cstring>
- #include <complex>
- #include <iostream>
- #include <algorithm>
- using namespace std;
- typedef long long ll;
- typedef unsigned long long ull;
- #define debug puts("here")
- #define rep(i,n) for(int i=0;i<n;i++)
- #define rep1(i,n) for(int i=1;i<=n;i++)
- #define REP(i,a,b) for(int i=a;i<=b;i++)
- #define foreach(i,vec) for(unsigned i=0;i<vec.size();i++)
- #define pb push_back
- #define RD(n) scanf("%d",&n)
- #define RD2(x,y) scanf("%d%d",&x,&y)
- #define RD3(x,y,z) scanf("%d%d%d",&x,&y,&z)
- #define RD4(x,y,z,w) scanf("%d%d%d%d",&x,&y,&z,&w)
- #define All(vec) vec.begin(),vec.end()
- #define MP make_pair
- #define PII pair<int,int>
- #define PQ priority_queue
- #define cmax(x,y) x = max(x,y)
- #define cmin(x,y) x = min(x,y)
- #define Clear(x) memset(x,0,sizeof(x))
- #define lson rt<<1
- #define rson rt<<1|1
- #define SZ(x) x.size()
- /*
- #pragma comment(linker, "/STACK:1024000000,1024000000")
- int ssize = 256 << 20; // 256MB
- char *ppp = (char*)malloc(ssize) + ssize;
- __asm__("movl %0, %%esp\n" :: "r"(ppp) );
- */
- char IN;
- bool NEG;
- inline void Int(int &x){
- NEG = 0;
- while(!isdigit(IN=getchar()))
- if(IN=='-')NEG = 1;
- x = IN-'0';
- while(isdigit(IN=getchar()))
- x = x*10+IN-'0';
- if(NEG)x = -x;
- }
- inline void LL(ll &x){
- NEG = 0;
- while(!isdigit(IN=getchar()))
- if(IN=='-')NEG = 1;
- x = IN-'0';
- while(isdigit(IN=getchar()))
- x = x*10+IN-'0';
- if(NEG)x = -x;
- }
- /******** program ********************/
- const int MAXN = 1e6+5;
- const int kind = 26;
- char s[MAXN];
- struct AC{
- int dp[MAXN];
- int ch[MAXN][kind],fail[MAXN];
- int end[MAXN];
- int tot;
- inline void set(int x){
- Clear(ch[x]);
- fail[x] = end[x] = dp[x] = 0;
- }
- inline void init(){
- set(tot = 1);
- }
- inline int newNode(){
- set(++tot);
- return tot;
- }
- inline int ind(char c){
- return c-'a';
- }
- inline void ins(){
- int r = 1;
- for(int i=0;s[i];i++){
- int c = ind(s[i]);
- if(ch[r][c]==0)
- ch[r][c] = newNode();
- r = ch[r][c];
- }
- ++end[r];
- }
- inline void build(){
- queue<int> q;
- q.push(1);
- while(!q.empty()){
- int r = q.front();
- q.pop();
- rep(c,kind){
- int x = ch[r][c];
- if(!x)continue;
- q.push(x);
- int y = fail[r];
- while(y&&ch[y][c]==0)
- y = fail[y];
- fail[x] = y?ch[y][c]:1;
- dp[x] = max( dp[r],dp[ fail[x] ] )+end[x];
- }
- }
- cout<<*max_element(dp+1,dp+tot+1)<<endl;
- }
- inline void run(){
- int n;
- while(RD(n),n){
- init();
- getchar();
- rep(i,n){
- gets(s);
- ins();
- }
- build();
- }
- }
- }ac;
- int main(){
- #ifndef ONLINE_JUDGE
- freopen("sum.in","r",stdin);
- //freopen("sum.out","w",stdout);
- #endif
- ac.run();
- return 0;
- }
SPOJ 7758. Growing Strings AC自动机DP的更多相关文章
- hdu 4117 GRE Words AC自动机DP
题目:给出n个串,问最多能够选出多少个串,使得前面串是后面串的子串(按照输入顺序) 分析: 其实这题是这题SPOJ 7758. Growing Strings AC自动机DP的进阶版本,主题思想差不多 ...
- HDU 2425 DNA repair (AC自动机+DP)
DNA repair Time Limit: 5000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- HDU 4758 Walk Through Squares (2013南京网络赛1011题,AC自动机+DP)
Walk Through Squares Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Oth ...
- POJ1625 Censored!(AC自动机+DP)
题目问长度m不包含一些不文明单词的字符串有多少个. 依然是水水的AC自动机+DP..做完后发现居然和POJ2778是一道题,回过头来看都水水的... dp[i][j]表示长度i(在自动机转移i步)且后 ...
- HDU2296 Ring(AC自动机+DP)
题目是给几个带有价值的单词.而一个字符串的价值是 各单词在它里面出现次数*单词价值 的和,问长度不超过n的最大价值的字符串是什么? 依然是入门的AC自动机+DP题..不一样的是这题要输出具体方案,加个 ...
- HDU2457 DNA repair(AC自动机+DP)
题目一串DNA最少需要修改几个基因使其不包含一些致病DNA片段. 这道题应该是AC自动机+DP的入门题了,有POJ2778基础不难写出来. dp[i][j]表示原DNA前i位(在AC自动机上转移i步) ...
- hdu 2457(ac自动机+dp)
题意:容易理解... 分析:这是一道比较简单的ac自动机+dp的题了,直接上代码. 代码实现: #include<stdio.h> #include<string.h> #in ...
- HDU2296——Ring(AC自动机+DP)
题意:输入N代表字符串长度,输入M代表喜欢的词语的个数,接下来是M个词语,然后是M个词语每个的价值.求字符串的最大价值.每个单词的价值就是单价*出现次数.单词可以重叠.如果不止一个答案,选择字典序最小 ...
- tyvj P1519 博彩游戏(AC自动机+DP滚动数组)
P1519 博彩游戏 背景 Bob最近迷上了一个博彩游戏…… 描述 这个游戏的规则是这样的:每花一块钱可以得到一个随机数R,花上N块钱就可以得到一个随机序列:有M个序列,如果某个序列是产生的随机序列的 ...
随机推荐
- WCF WEB API配置
Web.config配置 <system.serviceModel> <services> <service name="WCFServiceWebRole2. ...
- DataTable添加行和列
tablenullobjectdatasetc#c 手动插入一行数据 DataSet ds = tTalent.GetAllInfo(); DataRow dr = ds.Tables ...
- $( document ).ready()&$(window).load()
$( document ).ready() https://learn.jquery.com/using-jquery-core/document-ready/ A page can't be man ...
- as3.0:文字 效果
//文字描边效果var tf1 = _root.createTextField("tf1", _root.getNextHighestDepth(), 10, 10, 0, 0); ...
- pycharm快捷键大全
Python IDE PyCharm的快捷键大全1.编辑(Editing)Ctrl + Space 基本的代码完成(类.方法.属性)Ctrl + Alt + Space 快速导入任意类Ctrl + S ...
- Java常见排序算法之归并排序
在学习算法的过程中,我们难免会接触很多和排序相关的算法.总而言之,对于任何编程人员来说,基本的排序算法是必须要掌握的. 从今天开始,我们将要进行基本的排序算法的讲解.Are you ready?Let ...
- 广州项目实施步骤I_练习安装 CentOS x64 6.4
安装Centos x64 6.4 在家里使用 Vmware10.0.1进行模拟安装. 永久KEY注册密钥:5F29M-48312-8ZDF9-A8A5K-2AM0Z 下载地址:http://pan. ...
- JQueryMobile页面跳转参数的传递解决方案
在JQueryMobile开发手机端应用使用可能需要考虑相关的页面跳转带来的参数问题.因为JQueryMobile其实也是HTML5实践的结果.HTML5中有localStorage和sessionS ...
- [Node.js] Broswerify -- 2
Browserify allows you to leverage 10s of thousands of javascript modules available in the Node Packa ...
- Ubuntu:Target filesystem doesn't have /sbin/init (Slax 解决)
计算机(Ubuntu)因为异常断电或是其它原因,再次启动时.非常不幸的出现: Killed mount: mounting /dev on /root/dev failed: No such file ...