FZU 2128 字符串 处理

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

利用strstr  找到每个字符存在的位置   并标记首尾的位置a[k].l ,a[k].r   利用r的位置升序快拍可以思考 第一个肯定是a[0].r最后一个肯定是len-a[k-1].l-1;中间的利用前一个来计算即两种情况  如下
#include<algorithm>
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#include<math.h>
using namespace std;
#define INF 0x3f3f3f3f
#define N 1234567
char str[N],s[N];
struct node
{
    int l,r;
}a[N];
int cmp(node e,node f)
{
    if(e.r!=f.r)
    return e.r<f.r;
    return e.l<f.l;

}
int main()
{
    int n,len,q,len1;
    while(scanf("%s",str)!=EOF)
    {
        memset(a,0,sizeof(a));
        int k=0;
        scanf("%d",&n);
        len=strlen(str);
        for(int i=0;i<n;i++)
        {
            scanf("%s",s);
            len1=strlen(s);
            q=0;
            while(1)
            {
                q=strstr(str+q,s)-str;
                ///printf("%d\n",q);
                if(q<0||q>=len) break;
                a[k].l=q;
                a[k].r=q+len1-1;
                k++;
                q++;
            }
        }
        sort(a,a+k,cmp);
        if(k==0)///特殊情况优先输出
        {
            printf("%d\n",len);
            continue;
        }
        int m=max(len-a[k-1].l-1,a[0].r);
        for(int i=1;i<k;i++)
        {
            if(a[i].l<=a[i-1].l)  ///两种情况相差1  但是很重要   有明显的区别   自行画下就可以发现
                 m=max(m,a[i].r-a[i-1].l);
            else
                m=max(m,a[i].r-a[i-1].l-1);
        }

        printf("%d\n",m);
    }
    return 0;
}
时间: 2024-10-03 17:25:27

FZU 2128 字符串 处理的相关文章

FZU 2183 字符串处理

Problem Description 现在有一些被简单压缩的字符串,例如:a[120]代表120个a.对于字符串acb[3]d[5]e相对于acbbbddddde 现在给你两个字符串cString, nString.一个是被压缩过的字符串,另一个没有被压缩. 求nString是否为cString的子串,如果是输出True,否则输出False.cString的长度clen的范围是0<clen<1000, nString的长度的nlen的范围是0<nlen<1000;cString只

FZU 2128 最长子串

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

最长子串(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行字符串,长度不

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

FZU 2183 简单题(字符串匹配|字符串压缩)(简单)

Problem 2183 简单题 Accept: 138    Submit: 641 Time Limit: 1000 mSec    Memory Limit : 32768 KB  Problem Description 现在有一些被简单压缩的字符串,例如:a[120]代表120个a.对于字符串acb[3]d[5]e相对于acbbbddddde 现在给你两个字符串cString, nString.一个是被压缩过的字符串,另一个没有被压缩. 求nString是否为cString的子串,如果是

FZU - 2154 - YesOrNo (字符串~)

 Problem 2154 YesOrNo Accept: 129    Submit: 283 Time Limit: 1000 mSec    Memory Limit : 32768 KB  Problem Description A国认为如果字符串a可以通过操作X变成字符串b,就认为是一样的字符串. 操作X:将字符串分为两部分,然后调换位置,操作次数不限.W=xy,W'=yx.  Input 有多组测试数据,处理到文件结尾.每组测试数据包含两个个字符串(包含英文字符和数字,长度为[1,5

FZU ICPC 2020 寒假训练 6 —— 字符串处理

P1603 斯诺登的密码 题目描述 2013年X月X日,俄罗斯办理了斯诺登的护照,于是他混迹于一架开往委内瑞拉的飞机.但是,这件事情太不周密了,因为FBI的间谍早已获悉他的具体位置--但这不是最重要的--最重要的是如果要去委内瑞拉,那么就要经过古巴,而经过古巴的路在美国的掌控之中. 丧心病狂的奥巴马迫降斯诺登的飞机,搜查时却发现,斯诺登杳无踪迹.但是,在据说是斯诺登的座位上,发现了一张纸条.纸条由纯英文构成:Obama is a two five zero.(以"."结束输出,只有6个

算法分类整理+模板②:字符串处理

本周训练赛出了一道kmp模板题,但是由于长时间没有复习字符串处理算法,而且学习时也并没有彻底理解,只是大概明白了思路,所以导致比赛时迟迟没有做出这一题,最后现场拿出学校整理的材料现场重新学习才ac的这一题.趁这个机会整理一下常用的字符串处理算法以及模板. 字符串处理在比赛中一般都不是特别难(至少我遇到的没有),有的字符串处理会和dp放在一起出题,加大一些难度,而单纯的字符串处理其实还是比较好写. 一.strstr strstr(str1,str2) 函数用于判断字符串str2是否是str1的子串

fzu2172 字符串dp

F - 巡了南山我巡北山 Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Status Practice FZU 2172 Description 大师兄在取经途中迷上了ACM-ICPC,稍不留神,师傅就被妖怪抓走了. 大师兄并不着急去救师傅,在虐这道简单题: 有两个字符串A和B,每一次可以选择以下操作中的一种,只对字符串A进行操作,用最少的操作使得字符串A与字符串B相等: 在