思路: 对于每个子串,求出 母串中 所有该子串 的 开始和结束位置,保存在 mark数组中,求完所有子串后,对mark数组按 结束位置排序,然后 用后一个的结束位置 减去 前一个的 开始 位置 再 减去 1,记录最大值
比如 aaaqwer  1  aaa 那么 最长为 aaqwer

用strstr判断子串是否存在于母串中。

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std; const int maxn = 1000005; struct MARK {
int begin, end;
bool operator <(const MARK& cmp) const {
return end < cmp.end;
}
} mark[maxn]; char s[maxn], t[1005][105];
int n, cnt, next[105]; void work(const char str[], const char sub[]) {
//memset(next, 0, sizeof(next));
//get_next(sub, next);
int exp = 0, from, len = strlen(sub);
while (strstr(str + exp, sub) != NULL) {
from = strstr(str + exp, sub) - str;
mark[cnt].begin = from;
mark[cnt].end = from + len - 1;
cnt++;
exp = from + len - 1;
}
} int main() {
while (scanf("%s", s) == 1) {
scanf("%d", &n);
for (int i = 0; i < n; i++)
scanf("%s", t[i]);
cnt = 0;
for (int i = 0; i < n; i++) {
work(s, t[i]);
}
mark[cnt].begin = mark[cnt].end = strlen(s);
cnt++;
sort(mark, mark + cnt);
int ans = -1;
for (int i = 0; i < cnt - 1; i++) {
int len = mark[i + 1].end - mark[i].begin - 1;
if (len > ans)
ans = len;
}
printf("%d\n", ans == -1 ? strlen(s) : ans);
}
}

用KMP判断子串是否存在于母串中。

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std; const int maxn = 1000005; struct MARK {
int begin, end;
bool operator <(const MARK& cmp) const {
return end < cmp.end;
}
} mark[maxn]; char s[maxn], t[1005][105];
int n, cnt, next[105]; void get_next(const char *sub, int *next) {
int len = strlen(sub);
int i, k;
next[0] = k = -1;
for (i = 0; i < len;) {
if (k == -1 || sub[i] == sub[k]) {
k++;
i++;
if (sub[k] != sub[i])
next[i] = k;
else
next[i] = next[k];
} else
k = next[k];
}
} int KMP(const char *str, const char *sub, const int *next) {
int i, j;
int len1 = strlen(str), len2 = strlen(sub);
for (i = 0, j = 0; i < len1 && j < len2;) {
if (j == -1 || str[i] == sub[j]) {
i++;
j++;
} else
j = next[j];
}
if (j == len2)
return i - len2;
return -1;
} void work(const char str[], const char sub[]) {
//memset(next, 0, sizeof(next));
get_next(sub, next);
int exp = 0, from = 0, len = strlen(sub);
while ((from = KMP(str + exp, sub, next)) != -1) {
mark[cnt].begin = from + exp;
mark[cnt].end = from + exp + len - 1;
cnt++;
exp += from + len - (len == 1 ? 0 : 1);
}
} int main() {
while (scanf("%s", s) == 1) {
scanf("%d", &n);
for (int i = 0; i < n; i++)
scanf("%s", t[i]);
cnt = 0;
for (int i = 0; i < n; i++) {
work(s, t[i]);
}
// for (int i = 0; i < cnt; i++)
// printf("%d %d\n", mark[i].begin, mark[i].end);
mark[cnt].begin = mark[cnt].end = strlen(s);
cnt++;
sort(mark, mark + cnt);
int ans = -1;
for (int i = 0; i < cnt - 1; i++) {
int len = mark[i + 1].end - mark[i].begin - 1;
if (len > ans)
ans = len;
}
printf("%d\n", ans == -1 ? strlen(s) : ans);
}
}

福州大学第十届校赛 & fzu 2128最长子串的更多相关文章

  1. FZU 2128 最长子串

    题目链接:最长子串 思路:依次找出每个子串的在字符串中的首尾地址,所有子串先按照尾地址从小到大排序.然后首地址从小到大排. 遍历一遍每个子串的首地址和它后面相邻子串的尾地址之差-1, 第一个子串的首地 ...

  2. 河南省第十届省赛 Plumbing the depth of lake (模拟)

    title: Plumbing the depth of lake 河南省第十届省赛 题目描述: There is a mysterious lake in the north of Tibet. A ...

  3. 河南省第十届省赛 Intelligent Parking Building

    title: Intelligent Parking Building 河南省第十届省赛 tags: [模拟,省赛] 题目描述: There is a new revolution in the pa ...

  4. 四川第十届省赛 A.Angel Beats bitset

    四川第十届省赛 A.Angel Beats bitset 题目链接 题解参考:http://www.cnblogs.com/Aragaki/p/9142250.html 考虑用bitset来维护对于所 ...

  5. squee_spoon and his Cube VI---郑大校赛(求最长子串)

    市面上最常见的魔方,是三阶魔方,英文名为Rubik's Cube,以魔方的发明者鲁比克教授的名字命名.另外,二阶魔方叫Pocket Cube,它只有2*2*2个角块,通常也就比较小:四阶魔方叫Reve ...

  6. Problem 2128 最长子串(kmp+strstr好题经典)

     Problem 2128 最长子串 Accept: 134    Submit: 523Time Limit: 3000 mSec    Memory Limit : 65536 KB  Probl ...

  7. CSUST 第15届 校赛总结

    一直想记录一下自己的比赛,却感觉空间说说有点不适,思考了一番还是打算放到自己的博客园 这次比赛总体来说还是不错,签到还是稳的一批,基本前四小时都在rk1 开局切了几道签到题,然后开了一道思维gcd,正 ...

  8. HZNU第十二届校赛赛后补题

    愉快的校赛翻皮水! 题解 A 温暖的签到,注意用gets #include <map> #include <set> #include <ctime> #inclu ...

  9. fzu Problem 2128 最长子串(KMP + strstr 经典好题)

     Problem Description 问题很简单,给你一个字符串s,问s的子串中不包含s1,s2...sn的最长串有多长.  Input 输入包含多组数据.第一行为字符串s,字符串s的长度1到10 ...

随机推荐

  1. JAVA ANDROID SOCKET通信检测(SERVER)连接是否断开

    Pre 解决思路 代码后记: 客户端app上的部分代码 调用: 服务器上: 客户端判断服务器是否还活着代码: PRE 在利用socket写通讯程序的时候,想检测服务器是否还活着. 从网上找了很多资料, ...

  2. python2.7 串口操作方式 编译 .py为windows可运行exe文件

    一 python操作串口 首先下载安装串口模块pyserial . 代码实现: import serial ser = serial.Serial('/dev/ttyUSB2', 115200) pr ...

  3. 数据类型及其空间大小,vs2012实测

    #include "stdafx.h" #include <stdio.h> #include "common.h" #include " ...

  4. 《音乐商店》第4集:自动生成StoreManager控制器

    一.自动生成StoreManager控制器 二.查看 StoreManager 控制器的代码 现在,Store Manager 控制器中已经包含了一定数量的代码,我们从头到尾重新过一下. 1.访问数据 ...

  5. js动态向页面中添加表格

    我们在实际开发中经常会想要实现如下情况: 点击某个按钮,然后动态的网页面里面添加一个表格或者一行,这个更加灵活方便.但是实现起来肯定不能像在页面里面直接写标签来的容易,以下是我项目中的代码,拿过来分享 ...

  6. AT&T汇编

    AT&T汇编和8086汇编语言虽然两者很相似,但是还是不能根据8086的语法规则来读AT&T汇编的吧,所以还是要看看AT&T汇编的语法规则,因为在读内核代码时,跟硬件打交道的部 ...

  7. JAVA多态学习3

    这一节我们来学习抽象类 抽象类–深入讨论 抽象类是java中一个比較重要的类. 1.用abstract关键字来修饰一个类时.这个类就是抽象类. 2.用abstract关键字来修饰一个方法时,这种方法就 ...

  8. vi/vim高级命令集粹

    vi/vim高级命令集粹 (ctrl +v过来 留着以后看) 1.交换两个字符位置 xp 2.上下两行调换 ddp 3.把文件内容反转 :g/^/m0/ (未通过) 4.上下两行合并 J 5.删除所有 ...

  9. 使用boost中的property_tree实现配置文件

    property_tree是专为配置文件而写,支持xml,ini和json格式文件   ini比较简单,适合简单的配置,通常可能需要保存数组,这时xml是个不错的选择.   使用property_tr ...

  10. 使用POI创建Excel文件下载

    POIExcelUtils.java: package com.saicfc.pmpf.internal.manage.utils; import java.io.File; import java. ...