提交地址:[codevs][Uva]

题目描述 

递变是指通过增加、减少或改变单词x中的一个字母,使它变成字典中的另一个单词y。比如将dig变成dog,将dog变成do都是递变。递变阶梯是一个按字典序排列的单词序列w1,w2,...wn,满足对于从1到n-1的所有i,单词wi到wi+1都是一次递变。相同的单词之间不能递变。n=15000

给出一部字典,你要计算其中最长的递变阶梯。

题目分析

  容易看出这是一个DAG的最长路(类似LIS),那么我们可以想到一个O(n^2)的算法,显然超时.

  换个方式想,如果我们枚举每个字符串可以变成的另一个字符串,再判断是否在里面,那么容易发现不会超时(15000*16*26),那么我们可以这样建图,然后走DAG最长路,很可惜我下面这份代码由于Hash的特殊性,无法通过Uva,仅能通过Codevs

题目代码

  

 #include<bits/stdc++.h>
using namespace std;
string str[];
const int base = ;
typedef unsigned long long ull;
ull f[][];
ull base_pow[],ans[];
ull num[],pla[];
ull mod = ; int main(){
int n=;
while(cin>>str[++n])if(str[n]==str[n-])n--;
n--;
base_pow[]=;
for(int i=;i<=;i++)base_pow[i]=base_pow[i-]*base;
for(int i=;i<=n;i++){
f[i][]=str[i][]-'a'+;
for(int j=;j<str[i].length();j++)
f[i][j]=f[i][j-]*base+str[i][j]-'a'+;
num[f[i][str[i].length()-]%mod]=;
pla[f[i][str[i].length()-]%mod]=i;
}
for(int i=;i<=n;i++)ans[i]=;
for(int i=;i<=n;i++){
string s=str[i];
for(int j=;j<s.length();j++){
ull sd = f[i][s.length()-];
sd-=f[i][j]*base_pow[s.length()-j-];
if(j->=)
sd+=f[i][j-]*base_pow[s.length()-j-];
if(num[sd%mod]&&pla[sd%mod]<i&&s.length()->)
ans[i]=max(ans[i],ans[pla[sd%mod]]+);
}
for(int j=;j<s.length();j++){
ull sd = f[i][s.length()-];
sd-=f[i][j]*base_pow[s.length()-j-];
if(j->=)
sd+=f[i][j-]*base_pow[s.length()-j-];
if(num[sd%mod]&&pla[sd%mod]>i&&s.length()->)
ans[pla[sd%mod]]=max(ans[pla[sd%mod]],ans[i]+);
}
for(int j=;j<str[i].length();j++){
ull sd;
for(int k=;k<=;k++){
sd = f[i][s.length()-];
sd-=f[i][j]*base_pow[s.length()-j-];
sd+=k*base_pow[s.length()-j-];
if(j->=)
sd+=f[i][j-]*base_pow[s.length()-j];
if(num[sd%mod]&&pla[sd%mod]>i)
ans[pla[sd%mod]]=max(ans[pla[sd%mod]],ans[i]+);
}
}
}
ull maxx=;
for(int i=;i<=n;i++){
maxx=max(maxx,ans[i]);
}
cout<<maxx;
}

codevs2019 Uva10029 递变阶梯的更多相关文章

  1. (Step1-500题)UVaOJ+算法竞赛入门经典+挑战编程+USACO

    http://www.cnblogs.com/sxiszero/p/3618737.html 下面给出的题目共计560道,去掉重复的也有近500题,作为ACMer Training Step1,用1年 ...

  2. ACM训练计划step 1 [非原创]

    (Step1-500题)UVaOJ+算法竞赛入门经典+挑战编程+USACO 下面给出的题目共计560道,去掉重复的也有近500题,作为ACMer Training Step1,用1年到1年半年时间完成 ...

  3. 算法竞赛入门经典+挑战编程+USACO

    下面给出的题目共计560道,去掉重复的也有近500题,作为ACMer Training Step1,用1年到1年半年时间完成.打牢基础,厚积薄发. 一.UVaOJ http://uva.onlinej ...

  4. 向苹果App Store提交新应用的图文教程(转)

    当你克服重重困难终于开发出了自己的App,下一步就是向App Store提交应用了,这时应该如何操作呢?我的App真的准备好提交了?我敢肯定这些问题将会浮现在你的脑海.基于这篇教程,我将告诉你一个完整 ...

  5. 20160204.CCPP体系详解(0014天)

    程序片段(01):define.h+data.h&data.c+control.h&control.c+view.h&view.c+AI.h&AI.c+main.c 内 ...

  6. AHK(1)之运行程序或打开文档

    小鸟学AHK(1)之运行程序或打开文档   AHK就是AutoHotKey,是一款免费的.Windows平台下开放源代码的热键脚本语言. 亲爱的朋友,叫我怎么向你推荐它呢! COOL,对,就是酷,那么 ...

  7. iOS开发- 获取精确剩余电量

    [UIDevice currentDevice].batteryMonitoringEnabled = YES; double deviceLevel = [UIDevice currentDevic ...

  8. 关于前端的photoshop初探的学习笔记

    写在前边 这还是高三的时候暑假的时候学习这个软件时记的笔记呢,今天又在电脑上找到了它,总觉得不应该让他尘封在我的硬盘上,于是挂了出来.温馨提示:比较乱,写给自己看的,看不下去,按ctrl+W 笔记内容 ...

  9. 20160217.CCPP体系详解(0027天)

    程序片段(01):TestCmd.c 内容概要:管道_字符串 #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include < ...

随机推荐

  1. 前端项目经验总结之js防缓存(避免缓存的影响)

    一.问题描述:打包后的h5项目中有个server.js文件夹,这个文件夹有些时候用户更新了h5,但是加载的还是旧的server.js,所以怀疑是缓存的问题,为了避免缓存的影响所以要给server.js ...

  2. Matlab立体标定mat转换成Opencv的CvMat

    最近在做基于双目视觉的三维重建.比较opencv和matlab工具箱的立体标定结果精度时,发现貌似如果手工选取角点不那么离谱的话,matlab标定结果精度更高也更鲁棒.就想先用matlab标定好相机, ...

  3. windows service宿主web api使用"依赖注入"和“控制反转”的技术实践

    前言 自从几年前抛弃wcf,使用web api 来做服务器端开发之后,就不再迷惑了.但是因为本来从事传统行业管理软件开发,一般都以分布式应用开发为主.纯BS还是比较少,于是比较喜欢用windows s ...

  4. perl open函数

    open(DATA, "<file.txt"); # <只读打开file.txt ,DATA作为句柄 open(DATA, ">file.txt&quo ...

  5. ASP渲染下拉框使时间依次减少

    <%    x=year(now())    y=year(now())-1    Do While  y>2002%><li><a href="#201 ...

  6. 1022: [SHOI2008]小约翰的游戏John

    1022: [SHOI2008]小约翰的游戏John Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 1322  Solved: 829[Submit][ ...

  7. 说说MySQL中的Redo log Undo log都在干啥

        在数据库系统中,既有存放数据的文件,也有存放日志的文件.日志在内存中也是有缓存Log buffer,也有磁盘文件log file,本文主要描述存放日志的文件.     MySQL中的日志文件, ...

  8. IO 模型

    常见的IO模型有四种: (1)同步阻塞IO(Blocking IO):即传统的IO模型. (2)同步非阻塞IO(Non-blocking IO):默认创建的socket都是阻塞的,非阻塞IO要求soc ...

  9. 卸载php+apache+mysql

    一.卸载删除 mysql   1 sudo apt-get autoremove --purge mysql-server-5.0 2 sudo apt-get remove mysql-server ...

  10. mybatis与spring整合时读取properties问题的解决

    在学习mybatis与spring整合是,想从外部引用一个db.properties数据库配置文件,在配置文件中使用占位符进行引用,如下: <context:property-placehold ...