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 ofruizhang", and rzhang" is not a substring ofruizhang".

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,定义两个指针ij分别指向第一个串和第二个串,让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)相关推荐

  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. golang 字段 序列化 反序列化 简介
  2. SQL Server 求结果
  3. Introduction for i-Teams
  4. 工业机器人 扬州 江都_扬州市14家企业获批2019年江苏省示范智能车间
  5. C++语言基础 —— STL —— 容器与迭代器 —— pair
  6. 禁止复制php,wordpress禁止复制内容的实现方法
  7. 搜索服务Elasticsearch与Solr比较
  8. php 有request,php实现httpRequest的方法
  9. 硬盘助手写入文件的正确提取
  10. ps考证电脑怎么改卷
  11. ABAP 中的搜索帮助
  12. 如何用计算机录视频,如何用电脑录视频?
  13. 如何制作刷爆朋友圈的H5
  14. Kafka配置kerberos安全认证
  15. MATLAB 解数独
  16. remix os显卡linux,Remix OS for PC 详细版的安装教程
  17. 硬盘存储双寡头之争 希捷重注中国市场或赢大丰收
  18. 苹果电脑(mac)的快捷键大全
  19. 【工具篇】java导出excel工具类,多种模式自动配置,绝对值得你收藏
  20. 数据分析方法:非正态数据转化成正态数据

热门文章

  1. dismiss ios pop效果_动画切换效果之push、pop、present、dismiss
  2. 送学妹的生日礼物~ 制作一个超浪漫的告白3D相册(HTML+CSS+JavaScript)
  3. canvas实现动态矩形碰撞
  4. Unity3D中玩家的移动方式,三大类型,八种方式
  5. Python爬虫:新浪新闻详情页的数据抓取(函数版)
  6. spark-streaming 编程(四)自定义输出foreachRDD
  7. 高山仰止,景行行止,虽不能至,心向往之!软工大二狗的回顾与展望。
  8. 手机计算机里面的符号代表什么意思,计算器上的符号各代表什么意思?
  9. TGA文件转YUV文件
  10. 7-1 对象数组 (100 分)