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)相关推荐

  1. HDU 5510 Bazinga(kmp)

    题目戳这 题意:给你n个串,让你找到一个串,这个串的前面至少有一个不是它的子串,并且这个串要尽量靠后. 思路:弄两个变量当做指针来使,定义变量名为 l 和 r ,然后线性地往后面扫,如果s[l]不是s ...

  2. kmp求前缀和后缀的最大重复部分

    hdu 2594 kmp水题 求s1的前缀和s2的后缀重复度的最大值 2013-06-05 11:16 1199人阅读 评论(0) 收藏 举报  分类: KMP(8)  版权声明:本文为博主原创文章, ...

  3. BF算法优化-------KMP算法

    百度百科:KMP算法是一种改进的字符串匹配算法,由D.E.Knuth,J.H.Morris和V.R.Pratt提出的,因此人们称它为克努特-莫里斯-普拉特操作(简称KMP算法).KMP算法的核心是利用 ...

  4. MUV LUV EXTRA 2019CCPC秦皇岛站J题 KMP

    题目链接 题意:意思给你俩数一个字符串,然后让你对字符串小数点后边的字符串进行处理,找个一个循环节以及对应出现的长度, 然后用a*p-b*l算得到一个最大值 那肯定循环节就想到了KMP了,然后循环长度 ...

  5. 数据结构与算法(5)字符串(BF算法、KMP算法及KMP算法优化)

    目录 一.BF算法(暴力算法) 二.KMP算法 三.KMP算法优化 一.BF算法(暴力算法) 一个一个往后匹配,匹配失败继续从母串下一个和头(子串的头)往后继续匹配. 虽然简单,但是需要较多的时间复杂 ...

  6. 字符串匹配算法 -- BM(Boyer-Moore) 和 KMP(Knuth-Morris-Pratt)详细设计及实现

    文章目录 1. 算法背景 2. BM(Boyer-Moore)算法 2.1 坏字符规则(bad character rule) 2.2 好后缀规则(good suffix shift) 2.3 复杂度 ...

  7. 【笔记】震惊!世上最接地气的字符串浅谈(HASH+KMP)

    震惊!世上最接地气的字符串浅谈(HASH+KMP) 笔者过于垃圾,肯定会有些错的地方,欢迎各位巨佬指正,感激不尽! 引用:LYD的蓝书,一本通,DFC的讲稿,网上各路巨佬 Luguo id: 章鱼那个 ...

  8. hiho 1015 KMP算法 CF 625 B. War of the Corporations

    #1015 : KMP算法 时间限制:1000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi和小Ho是一对好朋友,出生在信息化社会的他们对编程产生了莫大的兴趣,他们约定好互相帮助,在 ...

  9. HDU 1711 Number Sequence(KMP算法)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1711 Number Sequence Time Limit: 10000/5000 MS (Java/ ...

  10. 算法(2)KMP算法

    1.0 问题描述 实现KMP算法查找字符串. 2.0 问题分析 "KMP算法"是对字符串查找"简单算法"的优化. 字符串查找"简单算法"是源 ...

最新文章

  1. Kafka面试题及答案整理 110道 (持续更新)
  2. php跨域cookie共享使用方法
  3. 新手谈谈网站交互设计
  4. firefox兼容性问题
  5. 试用 smartdraw 2010 方便快捷的图表工具
  6. if var matlab,matlab中if 语句后面的判别式不能是算术表达式?或者说变量?
  7. 强大软件防盗版控件.NET Reactor
  8. php 实现两变量值对换,php两个变量的值交换的方法
  9. 从源码深处体验Spring核心技术--基于Xml的IOC容器的初始化
  10. keras的学习笔记
  11. 漫画算法:判断2的乘方
  12. Flink的Table API 与SQL介绍及调用
  13. 为什么程序员都不愿意升级 Java 8?
  14. DIOCP开源项目-高效稳定的服务端解决方案(DIOCP + 无锁队列 + ZeroMQ + QWorkers) 出炉了
  15. maven-dependencyManagement和dependencies区别
  16. uni-app在华为应用市场上架审核无法通过,涉及个人信息:IMEI用户数据收集问题
  17. 小米电视5和5pro区别
  18. ERROR 1226 (42000):User 'root' has exceeded the 'max_questions' resource (current value: 2)
  19. 《现代汉语语法信息词典》的开发与应用
  20. Python手机号码归属判断

热门文章

  1. 超简单!Oneplus一加手机安装谷歌服务框架Google Play商店下载应用,安装谷歌三套件
  2. C++实现简单五子棋游戏
  3. 卸载了OneDrive如何重新安装
  4. 張學友 - Private Corner 新专辑1.29
  5. tensorflowpython32_Python tensorflow.python.framework.dtypes 模块,float32() 实例源码 - 编程字典...
  6. xubuntu装macos未能与服务器,macbook 安装ubuntu(Xubuntu)完整攻略
  7. Xubuntu22.04安装dock美化任务栏
  8. LeetCode K站中转内最便宜的航班(回溯法、动态规划)
  9. 推荐一个可以连gmail的邮箱
  10. qq西游服务器制作教程,QQ西游服务端文件说明 - 『天命/QQ西游』 - 任逍遥网游交流社区 | 任逍遥网游单机架设论坛 - Powered by Discuz!...