HDU5510 Bazinga(KMP)
Problem Description
Ladies and gentlemen, please sit up straight.
Don’t tilt your head. I’m serious.
For n given strings S1,S2,⋯,Sn, labelled from 1 to n, you should find the largest i (1≤i≤n) such that there exists an integer j (1≤j<i) and Sj is not a substring of Si.A substring of a string Si is another string that occurs in Si. For example,
ruiz" is a substring of
ruizhang", andrzhang" is not a substring of
ruizhang".
Input
The first line contains an integer t (1≤t≤50) which is the number of test cases.
For each test case, the first line is the positive integer n (1≤n≤500) and in the following n lines list are the strings S1,S2,⋯,Sn.
All strings are given in lower-case letters and strings are no longer than 2000 letters.
Output
For each test case, output the largest label you get. If it does not exist, output −1.
Sample Input
4
5
ab
abc
zabc
abcd
zabcd
4
you
lovinyou
aboutlovinyou
allaboutlovinyou
5
de
def
abcd
abcde
abcdef
3
a
ba
ccc
Sample Output
Case #1: 4
Case #2: -1
Case #3: 4
Case #4: 3
思路
给你了n
个字符串,每个字符串是s[i]
,让你找一个最大的i
使得s[i]
包含之前的任意一个字符串不是s[i]
的子串。
匹配的过程用优化版的kmp
,定义两个指针i
和j
分别指向第一个串和第二个串,让s[j]
包含s[i]
时,指针i++
,当i==j
时,指针j++
,当不包含时记录当前的j
,指针j++
.最后一个记录值就是答案.
代码
#include <bits/stdc++.h>
using namespace std;
const int N = 10000 + 10;
int nxt[N];
string s[N];
void get_next(string p)
{int len = p.length();int j = 0, k = -1;nxt[0] = -1;while (j < len){if (k == -1 || p[j] == p[k]){j++;k++;if (p[j] != p[k])nxt[j] = k;elsenxt[j] = nxt[k];}elsek = nxt[k];}
}
int get_index(string s, string p)
{int slen = s.length();int plen = p.length();get_next(p);int i = 0, j = 0;while (i < slen && j < plen){if (j == -1 || s[i] == p[j]){i++;j++;}elsej = nxt[j];}if (j == plen)return i - j;return -1;
}
void solve()
{int n;cin >> n;for (int i = 1; i <= n; i++){cin >> s[i];}int i = 1, j = 2, ans = -1;while (j <= n){if (get_index(s[j], s[i]) != -1){i++;if (i == j)j++;}else{ans = j;j++;}}cout << ans << endl;
}
int main()
{//freopen("in.txt", "r", stdin);ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);int t, q = 1;cin >> t;while (t--){cout << "Case #" << q++ << ": ";solve();}return 0;
}
HDU5510 Bazinga(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算法"是对字符串查找"简单算法"的优化. 字符串查找"简单算法"是源 ...
最新文章
- golang 字段 序列化 反序列化 简介
- SQL Server 求结果
- Introduction for i-Teams
- 工业机器人 扬州 江都_扬州市14家企业获批2019年江苏省示范智能车间
- C++语言基础 —— STL —— 容器与迭代器 —— pair
- 禁止复制php,wordpress禁止复制内容的实现方法
- 搜索服务Elasticsearch与Solr比较
- php 有request,php实现httpRequest的方法
- 硬盘助手写入文件的正确提取
- ps考证电脑怎么改卷
- ABAP 中的搜索帮助
- 如何用计算机录视频,如何用电脑录视频?
- 如何制作刷爆朋友圈的H5
- Kafka配置kerberos安全认证
- MATLAB 解数独
- remix os显卡linux,Remix OS for PC 详细版的安装教程
- 硬盘存储双寡头之争 希捷重注中国市场或赢大丰收
- 苹果电脑(mac)的快捷键大全
- 【工具篇】java导出excel工具类,多种模式自动配置,绝对值得你收藏
- 数据分析方法:非正态数据转化成正态数据
热门文章
- dismiss ios pop效果_动画切换效果之push、pop、present、dismiss
- 送学妹的生日礼物~ 制作一个超浪漫的告白3D相册(HTML+CSS+JavaScript)
- canvas实现动态矩形碰撞
- Unity3D中玩家的移动方式,三大类型,八种方式
- Python爬虫:新浪新闻详情页的数据抓取(函数版)
- spark-streaming 编程(四)自定义输出foreachRDD
- 高山仰止,景行行止,虽不能至,心向往之!软工大二狗的回顾与展望。
- 手机计算机里面的符号代表什么意思,计算器上的符号各代表什么意思?
- TGA文件转YUV文件
- 7-1 对象数组 (100 分)