题意:

给\(n(1 \leq n \leq 500)\)个字符串,求一个最大的\(i\),使得存在一个\(S_{j}\)不是\(S_i\)的子串。

分析:

维护两个指针\(l,r\)

那么有两种情况:

  • 如果\(S_l\)是\(S_r\)的子串,那么\(l\)++。
  • 如果\(S_l\)不是是\(S_r\)的子串,那么将答案更新为\(r\),然后\(r\)++。

考虑\(S_{r+1}\)的时候为什么同样不考虑\(S_l\)之前的串了呢?

因为\(S_l\)之前的串都是后面某个串的子串,所以如果他们中有不是\(S_{r+1}\)子串的串的话,那么一定有对应的那个串也不是\(S_{r+1}\)的子串。这样保证\(r\)一定能更新到\(ans\)。

因此降了一维的复杂度。

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std; const int maxn = 500 + 5;
const int maxl = 2000 + 5; int f[maxl]; char s[maxn][maxl]; void getFail(char* s) {
f[0] = f[1] = 0;
for(int i = 1; s[i]; i++) {
int j = f[i];
while(j && s[i] != s[j]) j = f[j];
f[i+1] = s[i] == s[j] ? j+1 : 0;
}
} bool match(char* T, char* P) {
int n = strlen(T), m = strlen(P);
getFail(P);
int j = 0;
for(int i = 0; i < n; i++) {
while(j && P[j] != T[i]) j = f[j];
if(P[j] == T[i]) j++;
if(j == m) return true;
}
return false;
} int main()
{
int T; scanf("%d", &T);
for(int kase = 1; kase <= T; kase++) {
int n; scanf("%d", &n);
for(int i = 1; i <= n; i++) scanf("%s", s[i]); int L = 1, R, ans = -1;
for(R = 2; R <= n; R++) {
while(L < R) {
if(match(s[R], s[L])) L++;
else {
ans = R;
break;
}
}
} printf("Case #%d: %d\n", kase, ans);
} return 0;
}

最新文章

  1. String 对象是不动态改变长度的
  2. 基于tiny6410的madplay播放器的移植
  3. oracle 中的round()函数、null值,rownum
  4. ICSharpCode.SharpZipLib.dll,MyZip.dll,Ionic.Zip.dll 使用
  5. AppCan应用开发之插件实践篇-支付插件
  6. CSS使块半透明方法,兼容IE6
  7. c# 中事务处理
  8. ------- 软件调试——注销 QQ 过滤驱动设置的事件通知 CallBack (完)-------
  9. 一次搞懂 Generator 函数
  10. egret编译 FATAL ERROR: CALL_AND_RETRY_0 Allocation failed process out of memory解决
  11. 洛谷P5205 【模板】多项式开根(多项式sqrt)
  12. 005_git专题
  13. python全栈开发day42-固定定位等
  14. IDEA教程之导入maven项目
  15. 5W2H+35问
  16. [转]mybatis if test非空判断数字0为什么是false
  17. 代码动态设置edittext输入类型为密码类型
  18. Python学习笔记010——形参与实参
  19. codeforces 200 div2 C. Rational Resistance 思路题
  20. IIS解决上传文件大小限制

热门文章

  1. ruby Iconv.iconv编码方法
  2. Unity3d发布apk文件并在Android虚拟机中运行的操作流程
  3. SQL Server数据库log shipping 灾备(Part2 )
  4. Linux基础环境_安装配置教程(CentOS7.2 64、JDK1.8、Tomcat8)
  5. SqlServer 填充因子的说明
  6. Netweaver和CloudFoundry的服务器日志
  7. Android(java)学习笔记116:BroadcastReceiver之 静态注册 和 动态注册
  8. js各运算符的执行顺序
  9. 影响一个UIView是否能正常显示的几个因素
  10. CMDB 数据加密 最终整合API验证+AES数据加密