题目描述

数据范围

=w=

暴力:

从前往后枚举一个i,再从前往后枚举一个j:

如果s[i]不是s[j]的子串,更新答案,继续枚举;

如果s[i]是s[j]的子串,停止枚举。

因为对于s[k] (k>j),s[i]如果不是s[k]的子串,那么s[j]也不是s[k]的子串。

代码

#include<iostream>
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<math.h>
#define ll long long
using namespace std;
const char* fin="sub.in";
const char* fout="sub.out";
const int inf=0x7fffffff;
const int maxn=507,maxlen=2007;
int t,n,i,j,k,p,ans;
char s[maxn][maxlen];
int len[maxn],fail[maxn][maxlen];
bool judge(int a,int b){
int i,j,k,p=0;
for (i=1;i<=len[b];i++){
while (p && s[a][p+1]!=s[b][i]) p=fail[a][p];
if (s[a][p+1]==s[b][i]) p++;
if (p==len[a]) return true;
}
return false;
}
int main(){
freopen(fin,"r",stdin);
freopen(fout,"w",stdout);
scanf("%d",&t);
while (t--){
scanf("%d",&n);
for (i=1;i<=n;i++) scanf("%s",s[i]+1);
for (i=1;i<=n;i++){
len[i]=strlen(s[i]+1);
p=0;
for (j=2;j<=len[i];j++){
while (p && s[i][p+1]!=s[i][j]) p=fail[i][p];
if (s[i][p+1]==s[i][j]) p++;
fail[i][j]=p;
}
}
ans=0;
for (i=1;i<=n;i++){
for (j=max(ans,i+1);j<=n;j++)
if (judge(i,j)) break;
else ans=j;
}
if (ans) printf("%d\n",ans);
else printf("-1\n");
}
return 0;
}

=o=

我的暴力和正解的区别:

正解:枚举i,然后处理所有i对其他人的贡献①;

我:枚举i,然后处理所有其他人对i的贡献②。

两种都显然正确;

但是区别是有的,前者可能会更容易优化。


类比动态规划:

对于两个等价的方程:

f[1..i−1]⇒f[i],以及f[i−1]⇒f[i]。

显然后者更容易优化,栗子


这个由于算的顺序不同导致我走远的栗子不唯一

这道题当时我算的方式跟正解不同,然后我化简化得很困难。


以后大概两种搜索方式都尝试一下吧。

【JZOJ4910】【NOIP2017模拟12.3】子串的更多相关文章

  1. 【NOIP2017模拟12.3】子串

    题目 分析 对于当前枚举串 \(now\),从前往后扫.若扫到 \(i\),\(s_i\) 是 ; \(s_j\) 的子串 \((i < j < now)\),我们就可以跳过不匹配 \(i ...

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

    5236. [NOIP2017模拟8.7A组]利普希茨 (File IO): input:lipschitz.in output:lipschitz.out Time Limits: 1000 ms ...

  3. JZOJ 5230. 【NOIP2017模拟A组模拟8.5】队伍统计

    5230. [NOIP2017模拟A组模拟8.5]队伍统计 (File IO): input:count.in output:count.out Time Limits: 1500 ms Memory ...

  4. JZOJ 5246. 【NOIP2017模拟8.8A组】Trip(trip)

    5246. [NOIP2017模拟8.8A组]Trip(trip) (File IO): input:trip.in output:trip.out Time Limits: 1500 ms Memo ...

  5. JZOJ 5235. 【NOIP2017模拟8.7A组】好的排列

    5235. [NOIP2017模拟8.7A组]好的排列 (File IO): input:permutation.in output:permutation.out Time Limits: 1000 ...

  6. noip模拟12[简单的区间·简单的玄学·简单的填数]

    noip模拟12 solutions 这次考试靠的还是比较好的,但是还是有不好的地方, 为啥嘞??因为我觉得我排列组合好像白学了诶,文化课都忘记了 正难则反!!!!!!!! 害没关系啦,一共拿到了\( ...

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

    Description

  8. 【NOIP2017提高组模拟12.24】B

    题目 现在你有N个数,分别为A1,A2,-,AN,现在有M组询问需要你回答.每个询问将会给你一个L和R(L<=R),保证Max{Ai}-Min{Ai}<=R-L,你需要找出并输出最小的K( ...

  9. 【NOIP2017提高组模拟12.17】环

    题目 小A有一个环,环上有n个正整数.他有特殊的能力,能将环切成k段,每段包含一个或者多个数字.对于一个切分方案,小A将以如下方式计算优美程度: 首先对于每一段,求出他们的数字和.然后对于每段的和,求 ...

随机推荐

  1. 中国 SaaS 企业如何突围?这几点是关键!

    进入2019年,关于SaaS的各种言论甚嚣尘上,有人看好:“SaaS市场得大客户者得天下”,也有人唱衰:“SaaS已死,下一个”.在众说纷纭中,中国SaaS企业的成功之路迷雾重重,前期走的较早的头部S ...

  2. NOIP2016提高A组 B题 【HDU3072】【JZOJ4686】通讯

    题目描述 “这一切都是命运石之门的选择.” 试图研制时间机器的机关SERN截获了中二科学家伦太郎发往过去的一条短 信,并由此得知了伦太郎制作出了电话微波炉(仮). 为了掌握时间机器的技术,SERN总部 ...

  3. Ionic login简单登录页面

    1.login.html <ion-view view-title="登录" hide-nav-bar="true"> <div class= ...

  4. c语言学习笔记 - 枚举类型

    今天学习了c语言的枚举类型的使用,可能是PHP里没使用过,开始看的时候还是觉得有点怪,后来做了下例子才理解,这里做个笔记记录一下. #include <stdio.h> enum anim ...

  5. 90 k数和 II

    原题网址:https://www.lintcode.com/problem/k-sum-ii/description 描述 Given n unique integers, number k (1&l ...

  6. 百钱白鸡(for循环的练习)

    <!doctype html> <html> <head> <meta charset="utf-8"> <title> ...

  7. 左神算法书籍《程序员代码面试指南》——2_11将单链表的每K个节点之间逆序

    [题目]给定一个单链表的头节点head,实现一个调整单链表的函数,使得每K个节点之间逆序,如果最后不够K个节点一组,则不调整最后几个节点.例如:链表:1->2->3->4->5 ...

  8. 使用Maven编译运行Storm入门代码(Storm starter)(转)

    Storm 官方提供了入门代码(Storm starter),即 Storm安装教程 中所运行的实例(storm-starter-topologies-0.9.6.jar),该入门代码位于 /usr/ ...

  9. Vuejs实战项目四:权限校验

    路由跳转参考文档:https://router.vuejs.org/zh/guide/advanced/navigation-guards.html 在/src下创建permission.js进行权限 ...

  10. golang的flag包源码解析与使用

    当我们 import  package时,package内的全局常量和全局变量会进行初始化,并且紧接着init函数会执行.因此我们先看一下flag包的全局常量和全局变量. 一.flag包的全局常量.全 ...