Description

Input

Sample Input

4
5
ab
abc
zabc
abcd
zabcd
4
you
lovinyou
aboutlovinyou
allaboutlovinyou
5
de
def
abcd
abcde
abcdef
3
a
ba
ccc

Output

Sample Output

4
-1
4
3

Data Constraint

Solution

  • 我们第一眼可以想到对于每一个串都使用KMP逐一匹配

  • 那么时间复杂度将是 O(T⋅N2⋅S)O(T·N^2·S),明显超限!

  • 继续思考,知道性质:对于三个串:a,b,c;

  • a是b的子串,b是c的子串;

  • 那么a也会是c的子串!

  • 于是我们想到优化,枚举相邻的两个子串,判断是否是子串

  • 如果是,那么就不需要处理,继续枚举!

  • 如果不是,那么就从下往上对于这个串进行一次逐一比对

  • 再加上是否大于Ans的剪枝优化

  • 时间复杂度可以接近 O(T⋅N⋅S)O(T·N·S),成功AC!

Code

#include<cstdio>
#include<cstring>
using namespace std;
const int N=501,M=2002;
int ans,n;
int a[N],next[N][M];
char s[N][M];
inline int read()
{int data=0; char ch=0;while(ch<'0' || ch>'9') ch=getchar();while(ch>='0' && ch<='9') data=data*10+ch-'0',ch=getchar();return data;
}
inline void init()
{n=read();ans=0;for(int i=1;i<=n;i++){scanf("%s",s[i]+1); a[i]=strlen(s[i]+1);for(int j=2,k=0;j<=a[i];j++){while(k && s[i][j]!=s[i][k+1]) k=next[i][k];if(s[i][j]==s[i][k+1]) k++;next[i][j]=k;}}
}//KMP的预处理
inline void work()
{for(int k=n;k>1 && k>ans;k--){bool bz=false;for(int i=1,j=0;i<=a[k];i++){while(j && s[k][i]!=s[k-1][j+1]) j=next[k-1][j];if(s[k][i]==s[k-1][j+1]) j++;if(j==a[k-1]){bz=true;break;}}//两两配对if(!bz){if(k>ans) ans=k;for(int p=n;p>k && p>ans;p--){bz=false;for(int i=1,j=0;i<=a[p];i++){while(j && s[p][i]!=s[k-1][j+1]) j=next[k-1][j];if(s[p][i]==s[k-1][j+1]) j++;if(j==a[k-1]){bz=true;break;}}if(!bz){if(p>ans) ans=p;break;}}//逐一配对}}if(!ans) printf("-1\n"); else printf("%d\n",ans);
}
int main()
{int T=read();while(T--){init();work();}return 0;
}

JZOJ 4910. 【NOIP2017模拟12.3】子串相关推荐

  1. JZOJ 4909. 【NOIP2017模拟12.3】李电下棋

    Description Input Sample Input 4 2 1 2 3 1 2 4 2 4 6 2 4 Output Sample Output wfl lidian wfl lidian ...

  2. [2021.1.31多校省选模拟12]随机变换的子串(线段树维护分治/字符串/自动机思想)

    [2021.1.31多校省选模拟12]随机变换的子串 对于这三种操作,我们惊奇地发现有这样的性质,所有长度大于4的字符串都可以通过变换变为长度小于等于4的字符串,那么查询本质不同的字符串我们只需要处理 ...

  3. JZOJ 4933. 【NOIP2017提高组模拟12.24】C

    Description Input Sample Input 10 9 3580 8597 508 9110 9162 9973 6017 1942 989 646 1 3 4 405 4 3 5 5 ...

  4. JZOJ.5264【NOIP2017模拟8.12】化学

    Description Input Output Sample Input 3 10 1 2 10 Sample Output 5 Data Constraint Hint 搜索.考虑到m很大,我们不 ...

  5. JZOJ 4932. 【NOIP2017提高组模拟12.24】B

    Description 现在你有 NN 个数,分别为 A1,A2,-,ANA1,A2,-,AN ,现在有M组询问需要你回答.每个询问将会给你一个L和R(L<=R)(L,保证 MaxAi−MinA ...

  6. JZOJ 4919. 【NOIP2017提高组模拟12.10】神炎皇

    Description 神炎皇乌利亚很喜欢数对,他想找到神奇的数对. 对于一个整数对 (a,b)(a,b),若满足 a+b<=na+b 且 a+ba+b 是 abab 的因子,则成为神奇的数对. ...

  7. JZOJ.5234【NOIP2017模拟8.7】外星人的路径

    Description 有一个外星人控制了你的大脑.一开始你处于原点(0,0).外星人有一个由(R,U,D,L)组成的长度为M 的操作序列,分别代表(右,上,下,左). 平面上有N 个关键点,每当外星 ...

  8. JZOJ 5977. 【清华2019冬令营模拟12.15】堆

    Description Input Output Sample Input 10 10 0 1 1 2 2 4 3 12 2 6 2 15 3 5 3 10 7 7 9 16 2 3 1 10 9 2 ...

  9. JZOJ 5236. 【NOIP2017模拟8.7A组】利普希茨

    Description Input 输入文件名为lipschitz.in. 第一行一个整数n. 接下来一行n个整数,描述序列A. 第三行一个数q . 接下来q行,每行三个整数.其中第一个整数type表 ...

最新文章

  1. C#面试题汇总(未完成)
  2. spring security源码分析之core包
  3. php 正则图片相对路径替换成绝对路径_相对路径的优缺点
  4. 访问数,每次访问页数,平均停留时间,跳出率
  5. Oracle.ManagedDataAccess 连接数据库用户名密码错误
  6. python ssh实现_SSH协议的Python实现paramiko
  7. string插入字符_String类
  8. MyEclipse断点调试不可用解决办法
  9. MobaXterm远程连接Linux图形用户界面
  10. vc6开发一个抓包软件_开发一个软件要多少钱?app软件开发的费用
  11. 一加将于10月14日推出新款Buds系列真无线耳塞
  12. uoj #111. 【APIO2015】Jakarta Skyscrapers
  13. 【博士后招聘】清华大学计算机系自然语言处理与社会人文计算实验室面向海内外招聘博士后...
  14. DSPE-PEG-Hydroxyl DSPE-PEG-OH 磷脂-聚乙二醇-羟基概述
  15. 解决Vivado仿真卡在executing simulate step
  16. Android Studio 关联源码
  17. ThreeJS 实现等值线效果
  18. 同学留步,我想跟你聊聊成长中的苦难
  19. linux终端解微分方程,解微分方程+ode求解器
  20. 流浪者(rover)

热门文章

  1. CNN卷积神经网络推导和实现
  2. Go 语言web 框架 Gin 练习8
  3. torch.flatten()函数
  4. 【Matlab】你想知道在图表标题中显示变量的一切
  5. [云炬创业基础笔记]第五章创业机会评估测试12
  6. [云炬创业基础笔记] 第四章测试12
  7. 云炬随笔20210714(1)
  8. 《蓝桥小记》 2018-04-01
  9. VTK修炼之道80:VTK开发基础_智能指针与引用计数
  10. Delphi中methodaddress的代码解析