Bazinga(HDU5510+KMP)
t题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5510
题目:
题意:找到一个编号最大的字符串满足:存在一个编号比它小的字符串不是它的字串。
思路:KMP。但是这题的复杂度极大,杭电服务器跑稳T,我还试了一发-_-||。想了很久想到一个玄学优化,我们首先比较相邻的两个字符串,假设为i和i-1,且i-1是i的字串,那么如果某个大编号包含i则必然包含i-1,此时就没有必要再和i-1跑一边KMP了。如下图所示:
代码实现如下:
1 #include <set> 2 #include <map> 3 #include <queue> 4 #include <stack> 5 #include <cmath> 6 #include <bitset> 7 #include <cstdio> 8 #include <string> 9 #include <vector> 10 #include <cstdlib> 11 #include <cstring> 12 #include <iostream> 13 #include <algorithm> 14 using namespace std; 15 16 typedef long long ll; 17 typedef pair<ll, ll> pll; 18 typedef pair<ll, int> pli; 19 typedef pair<int, ll> pil;; 20 typedef pair<int, int> pii; 21 typedef unsigned long long ull; 22 23 #define lson i<<1 24 #define rson i<<1|1 25 #define bug printf("*********\n"); 26 #define FIN freopen("D://code//in.txt", "r", stdin); 27 #define debug(x) cout<<"["<<x<<"]" <<endl; 28 #define IO ios::sync_with_stdio(false),cin.tie(0); 29 30 const double eps = 1e-8; 31 const int mod = 10007; 32 const int maxn = 2000 + 7; 33 const double pi = acos(-1); 34 const int inf = 0x3f3f3f3f; 35 const ll INF = 0x3f3f3f3f3f3f3f; 36 37 int t, n; 38 int nex[507][maxn], len[507], vis[507]; 39 char s[507][maxn]; 40 41 void get_next(int x) { 42 nex[x][1] = 0; 43 for(int i = 2, j = 0; i <= len[i]; i++) { 44 while(j > 0 && s[x][i] != s[x][j+1]) j = nex[x][j]; 45 if(s[x][i] == s[x][j+1]) j++; 46 nex[x][i] = j; 47 } 48 } 49 50 bool kmp(int x, int y) { 51 for(int i = 1, j = 0; i <= len[x]; i++) { 52 while(j > 0 && (j == len[y] || s[x][i] != s[y][j+1])) j = nex[y][j]; 53 if(s[x][i] == s[y][j+1]) j++; 54 if(j == len[y]) { 55 return true; 56 } 57 } 58 return false; 59 } 60 61 int main() { 62 //FIN; 63 scanf("%d", &t); 64 int icase = 0; 65 while(t--) { 66 scanf("%d", &n); 67 memset(vis, 0, sizeof(vis)); 68 for(int i = 1; i <= n; i++) { 69 scanf("%s", s[i] + 1); 70 len[i] = strlen(s[i] + 1); 71 get_next(i); 72 } 73 int flag = 1; 74 for(int i = n; i >= 2; i--) { 75 if(kmp(i, i-1)) { 76 vis[i-1] = 1; 77 } 78 } 79 for(int i = n; i >= 2; i--) { 80 for(int j = i - 1; j >= 1; j--) { 81 if(!vis[j] && !kmp(i, j)) { 82 flag = i; 83 break; 84 } 85 } 86 if(flag != 1) break; 87 } 88 printf("Case #%d: ", ++icase); 89 if(flag != 1) printf("%d\n", flag); 90 else printf("-1\n"); 91 } 92 return 0; 93 }
转载于:https://www.cnblogs.com/Dillonh/p/9424527.html
Bazinga(HDU5510+KMP)相关推荐
- HDU 5510 Bazinga(kmp)
题目戳这 题意:给你n个串,让你找到一个串,这个串的前面至少有一个不是它的子串,并且这个串要尽量靠后. 思路:弄两个变量当做指针来使,定义变量名为 l 和 r ,然后线性地往后面扫,如果s[l]不是s ...
- kmp求前缀和后缀的最大重复部分
hdu 2594 kmp水题 求s1的前缀和s2的后缀重复度的最大值 2013-06-05 11:16 1199人阅读 评论(0) 收藏 举报 分类: KMP(8) 版权声明:本文为博主原创文章, ...
- BF算法优化-------KMP算法
百度百科:KMP算法是一种改进的字符串匹配算法,由D.E.Knuth,J.H.Morris和V.R.Pratt提出的,因此人们称它为克努特-莫里斯-普拉特操作(简称KMP算法).KMP算法的核心是利用 ...
- MUV LUV EXTRA 2019CCPC秦皇岛站J题 KMP
题目链接 题意:意思给你俩数一个字符串,然后让你对字符串小数点后边的字符串进行处理,找个一个循环节以及对应出现的长度, 然后用a*p-b*l算得到一个最大值 那肯定循环节就想到了KMP了,然后循环长度 ...
- 数据结构与算法(5)字符串(BF算法、KMP算法及KMP算法优化)
目录 一.BF算法(暴力算法) 二.KMP算法 三.KMP算法优化 一.BF算法(暴力算法) 一个一个往后匹配,匹配失败继续从母串下一个和头(子串的头)往后继续匹配. 虽然简单,但是需要较多的时间复杂 ...
- 字符串匹配算法 -- BM(Boyer-Moore) 和 KMP(Knuth-Morris-Pratt)详细设计及实现
文章目录 1. 算法背景 2. BM(Boyer-Moore)算法 2.1 坏字符规则(bad character rule) 2.2 好后缀规则(good suffix shift) 2.3 复杂度 ...
- 【笔记】震惊!世上最接地气的字符串浅谈(HASH+KMP)
震惊!世上最接地气的字符串浅谈(HASH+KMP) 笔者过于垃圾,肯定会有些错的地方,欢迎各位巨佬指正,感激不尽! 引用:LYD的蓝书,一本通,DFC的讲稿,网上各路巨佬 Luguo id: 章鱼那个 ...
- hiho 1015 KMP算法 CF 625 B. War of the Corporations
#1015 : KMP算法 时间限制:1000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi和小Ho是一对好朋友,出生在信息化社会的他们对编程产生了莫大的兴趣,他们约定好互相帮助,在 ...
- HDU 1711 Number Sequence(KMP算法)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1711 Number Sequence Time Limit: 10000/5000 MS (Java/ ...
- 算法(2)KMP算法
1.0 问题描述 实现KMP算法查找字符串. 2.0 问题分析 "KMP算法"是对字符串查找"简单算法"的优化. 字符串查找"简单算法"是源 ...
最新文章
- Kafka面试题及答案整理 110道 (持续更新)
- php跨域cookie共享使用方法
- 新手谈谈网站交互设计
- firefox兼容性问题
- 试用 smartdraw 2010 方便快捷的图表工具
- if var matlab,matlab中if 语句后面的判别式不能是算术表达式?或者说变量?
- 强大软件防盗版控件.NET Reactor
- php 实现两变量值对换,php两个变量的值交换的方法
- 从源码深处体验Spring核心技术--基于Xml的IOC容器的初始化
- keras的学习笔记
- 漫画算法:判断2的乘方
- Flink的Table API 与SQL介绍及调用
- 为什么程序员都不愿意升级 Java 8?
- DIOCP开源项目-高效稳定的服务端解决方案(DIOCP + 无锁队列 + ZeroMQ + QWorkers) 出炉了
- maven-dependencyManagement和dependencies区别
- uni-app在华为应用市场上架审核无法通过,涉及个人信息:IMEI用户数据收集问题
- 小米电视5和5pro区别
- ERROR 1226 (42000):User 'root' has exceeded the 'max_questions' resource (current value: 2)
- 《现代汉语语法信息词典》的开发与应用
- Python手机号码归属判断
热门文章
- 超简单!Oneplus一加手机安装谷歌服务框架Google Play商店下载应用,安装谷歌三套件
- C++实现简单五子棋游戏
- 卸载了OneDrive如何重新安装
- 張學友 - Private Corner 新专辑1.29
- tensorflowpython32_Python tensorflow.python.framework.dtypes 模块,float32() 实例源码 - 编程字典...
- xubuntu装macos未能与服务器,macbook 安装ubuntu(Xubuntu)完整攻略
- Xubuntu22.04安装dock美化任务栏
- LeetCode K站中转内最便宜的航班(回溯法、动态规划)
- 推荐一个可以连gmail的邮箱
- qq西游服务器制作教程,QQ西游服务端文件说明 - 『天命/QQ西游』 - 任逍遥网游交流社区 | 任逍遥网游单机架设论坛 - Powered by Discuz!...