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. 20191127 Spring Boot官方文档学习(4.12)

    4.12.缓存(Caching) Spring框架提供了对应用程序透明添加缓存的支持.从本质上讲,抽象将缓存应用于方法,从而根据缓存中可用的信息减少执行次数.缓存逻辑是透明应用的,不会对调用者造成任何 ...

  2. spring -boot定时任务 quartz 基于 MethodInvokingJobDetailFactoryBean 实现

    spring 定时任务 quartz 基于  MethodInvokingJobDetailFactoryBean 实现 依赖包 如下 <dependencies> <depende ...

  3. spring boot 异常汇总

    spring boot JPA 异常: org.springframework.data.mapping.PropertyReferenceException: No property role fo ...

  4. Vim常用的功能命令

    一.编辑 查看行号     :set nu 删除一整行   dd 删除1到10行     :1,10d 删除所有内容     dG 当前行下插入一空行   o 撤销改动    u 查看当前行信息    ...

  5. Spark-Core RDD依赖关系

    scala> var rdd1 = sc.textFile("./words.txt") rdd1: org.apache.spark.rdd.RDD[String] = . ...

  6. 锋利的jQuery 要点归纳(一) jQuery选择器

    1 基本选择器 $(#id)    根据给定的id匹配一个元素$(.class)    根据给定的类名匹配元素$(element)    根据给定的元素名匹配元素$(*)    匹配所有元素$(sel ...

  7. Luogu P5470 [NOI2019]序列

    题目 可以直接贪心,但是用模拟费用流推的话会更轻松. 首先有一个显然的建图方式: \(S\)到\(0\)流量为\(k\),费用为\(0\). \(0\)到\(a_i\)流量为\(1\),费用为\(-a ...

  8. [BZOJ 3930] [CQOI 2015]选数(莫比乌斯反演+杜教筛)

    [BZOJ 3930] [CQOI 2015]选数(莫比乌斯反演+杜教筛) 题面 我们知道,从区间\([L,R]\)(L和R为整数)中选取N个整数,总共有\((R-L+1)^N\)种方案.求最大公约数 ...

  9. mysql低版本升级到5.7

    升级步骤 #安全的停止数据库的运行 /etc/init.d/mysql.server stop # 解压mysql tar包 tar zxf mysql-5.7.28-linux-glibc2.12- ...

  10. luogu P5337 [TJOI2019]甲苯先生的字符串

    传送门 所以这题和字符串有什么关系 首先可以写出dp,\(f_{i,j}\)表示前\(i\)位,最后一个字符是\(j\)的方案,转移枚举下一位,只要不在大串中前后相邻即可.然后矩乘优化即可 // lu ...