Bazinga

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 593    Accepted Submission(s): 241

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", and ``rzhang" 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
 
Source

题意:n个字符串,s[i] (1≤i≤n),找到最大的i,是得存在j(1≤j<i)使得,s[j]不是 s[i]的子串。

#include<iostream>
#include<cstdio>
#include<cstring> using namespace std; char s[550][2200];
int Next[550][2200]; int Judge(int w, int o)
{
int i = 0 , j = 0;
int l1, l2;
l1 = strlen(s[w]);
l2 = strlen(s[o]); while(i < l1 && j < l2)
{
if(s[w][i] == s[o][j] || i == -1)
{
i++;
j++;
}
else
i = Next[w][i]; if(i == l1)
{
return true;
}
}
return false;
} void getNext(int q)
{
int j, k;
int i = strlen(s[q]);
j = 0;
k = -1;
Next[q][0] = -1; while(j < i)
{
if(k == -1 || s[q][j] == s[q][k])
{
j++;
k++;
Next[q][j] = k;
}
else
k = Next[q][k];
}
} int main()
{
int t, n, index, l = 1;
scanf("%d", &t); while(t--)
{
scanf("%d", &n);
for(int i = 0; i < n; i++)
{
scanf("%s", s[i]);
getNext(i);
}
index = -1;
int q;
for(int i = n-2; i >= 0; i--)
{
if(!Judge(i, i+1)) 找到一个字符串不满足前后是子串关系后,从后向前找最大的不满足子串的串
{
q = i;
for(int j = n-1; j > q; j--)
{
if(!Judge(q, j))
index = index > j ? index : j;
}
}
}
if(index == -1)
printf("Case #%d: %d\n", l++, index);
else
printf("Case #%d: %d\n", l++, index+1);
}
return 0;
}

  strstr阔以考虑……脉动回来

学长递归写法……

#include<iostream>
#include<cstdio>
#include<cstring> using namespace std; int n, num;
char s[550][2200]; void slove(int k)
{
if(k == 0 || num == n-1)
return ;
if(strstr(s[k], s[k-1]))
slove(k-1); // 向下寻找
else
{
for(int i = n-1; i >= num; i--) // 找最大的 下标
{
if(strstr(s[i], s[k-1]) == 0)
{
num = i;
break; //
}
}
slove(k-1); // 继续向下寻找看是否有 存在 k 使 num 最大
}
} int main()
{
int t, l = 1;
scanf("%d", &t); while(t--)
{
scanf("%d", &n);
num = -1;
for(int i = 0; i < n; i++)
scanf("%s", s[i]);
slove(n-1);
printf("Case #%d: %d\n", l++, num == -1 ? num : num+1);
}
return 0;
}

  

Bazinga的更多相关文章

  1. HDU 5510 Bazinga (2015沈阳现场赛,子串判断)

    Bazinga Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Sub ...

  2. HDU 5510 Bazinga 暴力匹配加剪枝

    Bazinga Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=5510 ...

  3. hdu 5510 Bazinga(字符串kmp)

    Bazinga Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Sub ...

  4. Bazinga HDU 5510 Bazinga(双指针)

    Bazinga HDU 5510 Bazinga(双指针) 题链 解法:对于串i来说,如果串i是不符合的,那么代表串i之前的字符串都是i的子串,那么我们求一个新的i(定义为ti),如果i是ti 的子串 ...

  5. HDU 5510:Bazinga(暴力KMP)

    http://acm.hdu.edu.cn/showproblem.php?pid=5510 Bazinga Problem Description   Ladies and gentlemen, p ...

  6. TTTTTTTTTTTTTTTT hdu 5510 Bazinga 字符串+哈希

    Bazinga Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Sub ...

  7. Bazinga means

    Bazinga means Bazinga https://www.dictionary.com/e/slang/bazinga/ refs xgqfrms 2012-2020 www.cnblogs ...

  8. HDU 5510 Bazinga (字符串匹配)

    题目:传送门. 题意:t 组数据,每组 n 个串,对于第 i 个串如果存在 1 到 i-1 中的某个串不是 i 的子串,那么这个第 i 个串符合题意,求 i 的最大值. 题解:KMP,AC自动机也可以 ...

  9. [HDOJ5510]Bazinga(并查集)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5510 普通集合会tle,换高贵的并查集. #include <algorithm> #in ...

随机推荐

  1. Canvas入门06-线段与像素边界

    我们知道,使用以下2个API可以绘制一条线段: moveTo(x, y) 向当前路径中增加一条子路径,该子路径只包含一个点,此为线段的起始点 lineTo(x, y) 将线段的下一个点加入子路径中 c ...

  2. C语言第十二周作业

        这个作业属于那个课程 C语言程序设计II 这个作业要求在哪 https://edu.cnblogs.com/campus/zswxy/computer-scienceclass3-2018/h ...

  3. Git入门资料

    1.廖雪峰老师Git教程 地址:https://www.liaoxuefeng.com/wiki/896043488029600 2.Eclipse eGit连接GitHub教程 地址:https:/ ...

  4. Vue 2.0 入门系列(15)学习 Vue.js 需要掌握的 es6 (2)

    类与模块 类 es6 之前,通常使用构造函数来创建对象 // 构造函数 User function User(username, email) { this.username = username; ...

  5. MySQL插入emoji表情报错 SQLException: Incorrect string value 的两种解决方案

    摘抄自:https://blog.csdn.net/dmw412724/article/details/81119325 原因:mysql的UTF-8只支持三个字节的存储,而一般字符是三个字节,但是e ...

  6. JS封装插件:实现文件读写功能

    scripting.FileSystemObject是一个可以实现文件读写的COM组件,由于COM组件可以被跨语言调用,因此可以选择像vbs或者JS这种脚本语言调用,下面我就使用该COM组件封装了一个 ...

  7. MyBatis逆向工程无效

    在Taget目录下修改的东西无法逆向, 在源代码目录就可以

  8. You-Get,多网站视频下载工具,非常方便

    You-Get是一个非常优秀的网站视频下载工具.使用You-Get可以很轻松的下载到网络上的视频.图片及音乐. 按Win+R键打开运行,输入cmd,再输入命令 pip install you-get, ...

  9. 最长上升子序列(LIS) Easy

    A numeric sequence of ai is ordered if a1 < a2 < ... < aN. Let the subsequence of the given ...

  10. MySQL---数据库切分

    3.切分 水平切分   水平切分又称为sharding,它是将同一个表的记录拆分到多个结构相同的表中.当一个表的数据不断的增加的时候,sharding是必然的选择,它可以将数据分布到集群的不同节点上, ...