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

 Problem Description

问题很简单,给你一个字符串s,问s的子串中不包含s1,s2...sn的最长串有多长。

 Input

输入包含多组数据。第一行为字符串s,字符串s的长度1到10^6次方,第二行是字符串s不能包含的子串个数n,n<=1000。接下来n行字符串,长度不大于100。

字符串由小写的英文字符组成。

 Output

最长子串的长度

Sample Input
lgcstraightlalongahisnstreet
5
str
long
tree
biginteger
ellipse
Sample Output
12

题目链接:http://acm.fzu.edu.cn/problem.php?pid=2128

*************************************************

题意:

分析:利用strstr()函数将每个字串在原串中的首尾位置存储一下,再将首尾从小到大排一下序。

AC代码:

判题oj炸了,,,wait...

*:

 1 kmp代码:
 2 #include<stdio.h>
 3 #include<string.h>
 4 #include<stdlib.h>
 5 #define MAX(x,y)(x>y?x:y)
 6 const int MAXN=1000010;
 7 char mstr[MAXN];
 8 char str[110];
 9 struct Node{
10     int s,e;
11 };
12 Node area[MAXN];
13 int cmp(const void *a,const void *b){
14     if((*(Node *)a).e!=(*(Node *)b).e)return (*(Node *)a).e-(*(Node *)b).e;
15     else return (*(Node *)a).s-(*(Node *)b).s;
16 }
17 int p[110],top;
18 void getp(){
19     int i=0,j=-1;
20     p[0]=-1;
21     while(str[i]){
22         if(j==-1||str[i]==str[j]){
23             i++;j++;
24             p[i]=j;
25         }
26         else j=p[j];
27     }
28 }
29 void kmp(){
30     getp();
31     int i=0,j=0;
32     while(mstr[i]){
33         if(j==-1||mstr[i]==str[j]){
34             i++;j++;
35             if(!str[j])area[top].s=i-j,area[top++].e=i-1;
36         }
37         else j=p[j];
38     }
39 }
40 int main(){
41     int N;
42     while(~scanf("%s",mstr)){
43         top=0;
44         scanf("%d",&N);
45         for(int i=0;i<N;i++){
46             scanf("%s",str);
47             kmp();
48         }
49         int ans=0;
50         int n=strlen(mstr),t=0,temp;
51         area[top].s=n;area[top].e=n;
52         qsort(area,top+1,sizeof(area[0]),cmp);
53         //for(int i=0;i<=top;i++)printf("%d %d\n",area[i].s,area[i].e);
54         for(int i=0;i<=top;i++){
55             temp=area[i].e-t;
56             ans=MAX(ans,temp);
57             t=area[i].s+1;//注意*****
58         }
59         printf("%d\n",ans);
60     }
61     return 0;
62 }
时间: 2024-10-09 20:44:57

fzu Problem 2128 最长子串(KMP + strstr 经典好题)的相关文章

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

 Problem 2128 最长子串 Accept: 134    Submit: 523Time Limit: 3000 mSec    Memory Limit : 65536 KB  Problem Description 问题很简单,给你一个字符串s,问s的子串中不包含s1,s2...sn的最长串有多长.  Input 输入包含多组数据.第一行为字符串s,字符串s的长度1到10^6次方,第二行是字符串s不能包含的子串个数n,n<=1000.接下来n行字符串,长度不大于100. 字符串由小

FZU 2128 最长子串

题目链接:最长子串 思路:依次找出每个子串的在字符串中的首尾地址,所有子串先按照尾地址从小到大排序.然后首地址从小到大排. 遍历一遍每个子串的首地址和它后面相邻子串的尾地址之差-1, 第一个子串的首地址,字符串长度-最后一个子串的首地址-1的最大值就是ans. st1----------ed1 -------st2------------ed2 例如这种情况说明,可能出现的一个ans 就是 ed2和st1之间的字符个数.这时候没有ed2最后一个字符,st1第一个字符,所以不包含str1和str2

Uva 12012 Detection of Extraterrestrial 求循环节个数为1-n的最长子串长度 KMP

题目链接:点击打开链接 题意: 给定一个字符串str 求字符串str的 循环节个数为 1-len 个的 最长子串长度 思路:套用kmp的性质 #include<string.h> #include<stdio.h> #include <iostream> using namespace std; #define n 1300 void getnext(char str[n],int next[n]){ int m=strlen(str); next[0]=next[1]

最长子串(FZU2128)

最长子串 Time Limit:3000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Submit Status Practice FZU 2128 Description 问题很简单,给你一个字符串s,问s的子串中不包含s1,s2...sn的最长串有多长. Input 输入包含多组数据.第一行为字符串s,字符串s的长度1到10^6次方,第二行是字符串s不能包含的子串个数n,n<=1000.接下来n行字符串,长度不

九度OJ 1535 重叠的最长子串

重叠的最长子串 http://ac.jobdu.com/problem.php?pid=1535 时间限制:1 秒 内存限制:128 兆 题目描述: 给定两个字符串,求它们前后重叠的最长子串的长度,比如"abcde"和“cdefg”是"cde",长度为3. 输入: 输入可能包含多个测试案例.对于每个测试案例只有一行, 包含两个字符串.字符串长度不超过1000000,仅包含字符'a'-'z'. 输出: 对应每个测试案例,输出它们前后重叠的最长子串的长度. 样例输入:

FZU Problem 2034 Password table (简单模拟题)

这种简单题做了好长时间,我是不是有点逗? 地址:http://acm.fzu.edu.cn/problem.php?pid=2034 不解释了,自己看吧,练手的好题 上个代码吧 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 #include <stdio.h> #include <string.h> #include <stdlib.h>

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

市面上最常见的魔方,是三阶魔方,英文名为Rubik's Cube,以魔方的发明者鲁比克教授的名字命名.另外,二阶魔方叫Pocket Cube,它只有2*2*2个角块,通常也就比较小:四阶魔方叫Revenge Cube,这是因为就算你好不容易复原了三阶魔方,四阶魔方也会向你“复仇”:而五阶魔方叫Professor Cube,人们认为只有专家才能够复原这么复杂的魔方. 作为ACM(A Cube Master),squee_spoon准备为九阶正十二面体魔方命名,此时他的脑中浮现出一个长长的字符串S,

最长子串(长沙理工大学第十一届程序设计竞赛 离线 做了n天.....崩溃了)

最长子串 Time Limit : 4000/2000ms (Java/Other)   Memory Limit : 65535/65535K (Java/Other) Total Submission(s) : 27   Accepted Submission(s) : 4 Font: Times New Roman | Verdana | Georgia Font Size: ← → Problem Description 小E最近开始研究数列,于是小J就给他出了一道题目:给你一个长度为n

D - Milk Patterns (出现k次可重复的最长子串的长度)

题目链接:https://cn.vjudge.net/contest/283743#problem/D 题目大意:给你n个数,然后问你出现m次的最长子串的长度. 具体思路:和上一篇博客的内容差不多,这个是可重复的,就不需要考虑sa的问题了,每一次还是二分答案,判断出现的最长前缀就可以了.注意二分的时候,每一次的寻找,初始值为1,因为这个字符串就已经出现过一次了. AC代码: 1 #include<iostream> 2 #include<stack> 3 #include<c