题意:给定n个由小写字母组成的字符串,第i个字符串为a[i],求最大的j满足存在1<=i<j,a[i]不是a[j]的子串,无解输出-1

T<=50,n<=500,len[i]<=2000

思路:队友写的,抱大腿

判断某个串是否是另一个串的子串可以使用KMP

有一个优化:若a[i-1]是a[i]的子串,则将a[i-1]标记,后面不需要再枚举它

队友的写法是把连续一段缩成了一个

 #include<bits/stdc++.h>
using namespace std;
#define LL long long
const int maxn=;
char s[maxn][maxn<<];
int nxt[maxn][maxn<<];
int len[maxn];
int p[maxn];
void getnext(int x)
{
int i=; int j=;
nxt[x][]=;
int n=len[x];
while(j<=n)
{
if(!i||s[x][i]==s[x][j])
{
i++; j++;
nxt[x][j]=i;
}
else i=nxt[x][i];
}
}
int kmp(int x,int y)
{
int i=; int j=;
int m=len[x];
int n=len[y];
while(j<=m)
{
if(!i||s[y][i]==s[x][j])
{
i++; j++;
if(i>n)
{
return ;
}
}
else i=nxt[y][i];
}
return ;
}
int main()
{
int T;
scanf("%d",&T);
int cas=;
while(T--)
{
int n;
scanf("%d",&n);
memset(s,,sizeof(s));
for(int i=;i<=n;i++)
{
scanf("%s",s[i]+);
len[i]=strlen(s[i]+);
getnext(i);
}
int g=;
int num=;
int r=n;
int l=;;
for(int i=n;i>=;i--)
{
if(!kmp(i,i-))
{
if(num==)
{
l=i;
}
p[++num]=i-;
}
}
printf("Case #%d: ",++cas);
if(!l)
printf("-1\n");
else
{
for(int i=;i<=num;i++)
{
for(int j=r;j>=l;j--)
{
if(!kmp(j,p[i]))
{
l=j;
break;
}
}
if(l==r)
break;
}
printf("%d\n",l);
}
}
}

【HDOJ5510】Bazinga(KMP)的更多相关文章

  1. 【BZOJ3670】动物园(KMP算法)

    [BZOJ3670]动物园(KMP算法) 题面 BZOJ 题解 神TM阅读理解题 看完题目之后 想暴力: 搞个倍增数组来跳\(next\) 每次暴跳\(next\) 复杂度\(O(Tnlogn)\) ...

  2. 【BZOJ3670】【NOI2014】动物园(KMP算法)

    [BZOJ3670]动物园(KMP算法) 题面 BZOJ 题解 神TM阅读理解题 看完题目之后 想暴力: 搞个倍增数组来跳\(next\) 每次暴跳\(next\) 复杂度\(O(Tnlogn)\) ...

  3. NoSQL之【MongoDB】学习(三):配置文件说明

    摘要: 继上一篇NoSQL之[MongoDB]学习(一):安装说明 之后,知道了如何安装和启动MongoDB,现在对启动时指定的配置文件(mongodb.conf)进行说明,详情请见官方. 启动Mon ...

  4. 【操作系统】进程间通信(C#)

    原文:[操作系统]进程间通信(C#) 08年9月入学,12年7月毕业,结束了我在软件学院愉快丰富的大学生活.此系列是对四年专业课程学习的回顾,索引参见:http://blog.csdn.net/xia ...

  5. 【Luogu3444】ORK-Ploughing(贪心)

    [Luogu3444]ORK-Ploughing(贪心) 题面 Luogu 题解 我们知道,如果我们选定了以横向为主,或者纵向为主, 那么就有尽可能减少另一个方向上耕地的次数 所以分开贪心,但是本质相 ...

  6. 【BZOJ1997】Planar(2-sat)

    [BZOJ1997]Planar(2-sat) 题面 BZOJ 题解 很久没做过\(2-sat\)了 今天一见,很果断的就来切 这题不难呀 但是有个玄学问题: 平面图的性质:边数\(m\)的最大值为\ ...

  7. 【Luogu1337】平衡点(模拟退火)

    [Luogu1337]平衡点(模拟退火) 题面 洛谷 题解 和BZOJ3680吊打XXX是一样的.. 但是数据很强呀.. 疯狂调参 各种WA... 很无奈呀.... #include<iostr ...

  8. 【BZOJ1996】合唱队(动态规划)

    [BZOJ1996]合唱队(动态规划) 题面 BZOJ 题解 很容易的一道题 因为每个人不是放在了左边就是放在了右边 所以每次放好的人必定是原序列的一个子串 所以,很容易想到区间\(dp\) 设\(f ...

  9. 【BZOJ1899】午餐(动态规划)

    [BZOJ1899]午餐(动态规划) 题面 BZOJ 题解 我太弱了 这种\(dp\)完全做不动.. 首先,感性理解一些 如果所有人都要早点走, 那么,吃饭时间长的就先吃 吃饭时间短的就晚点吃 所以, ...

随机推荐

  1. sigqueue与kill详解及实例

    /*********************************************************************************************** 相关函 ...

  2. Uva 填充正方形

    暴力出奇迹 #include<iostream> #include<cstdio> using namespace std; +; int T,n; char S[maxn][ ...

  3. 简单的Maven+SpringMVC

    一.SpringMVC非注解编程 1:修改pom.xml文件(相当于非Maven项目的导入jar包) <!-- https://mvnrepository.com/artifact/org.sp ...

  4. 七、MySQL 选择数据库

    MySQL 选择数据库 在你连接到 MySQL 数据库后,可能有多个可以操作的数据库,所以你需要选择你要操作的数据库. 从命令提示窗口中选择MySQL数据库 在 mysql> 提示窗口中可以很简 ...

  5. 用描述符实现缓存功能和property实现原理

    class Lazyproperty: def __init__(self, func): self.func = func def __get__(self, instance, owner): p ...

  6. [Hdu1693]Eat the Trees(插头DP)

    Description 题意:在n*m(1<=N, M<=11 )的矩阵中,有些格子有树,没有树的格子不能到达,找一条或多条回路,吃完所有的树,求有多少种方法. Solution 插头DP ...

  7. Java面向对象---方法递归调用

    递归调用是一种特殊的调用形式,即方法自己调用自己 public int method(int num){ if(num==1){ return 1; } else { return num+metho ...

  8. border,border-width不支持百分比

    1.border-width不支持百分比 原因:不会因为设备大就按比例变大 同样的,outline,box-shadow,text-shadow也不支持百分比 也就是border不支持百分比 2.bo ...

  9. Jquery查询分析器

    find() 方法获得当前元素集合中每个元素的后代,通过选择器.jQuery 对象或元素来筛选.$(this).find("ul[index=1] div input:radio:check ...

  10. leetcode 【 Convert Sorted List to Binary Search Tree 】python 实现

    题目: Given a singly linked list where elements are sorted in ascending order, convert it to a height ...