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


     Problem 2128 最长子串

    Accept: 134    Submit: 523
    Time 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。

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

     Output

    最长子串的长度

     Sample Input

    lgcstraightlalongahisnstreet 5 str long tree biginteger ellipse

     Sample Output

    12
    题解:想着把匹配的位置记录下来,记录成区间,关键在于位置内长度的查找,让母串组不成子串,就想着让起始位置加一就破坏了;
    真不知道// ans=max(dt[i].t-dt[i-1].s-1,ans);
       
       temp=dt[i].t-t;
                ans=max(ans,temp);
                t=dt[i].s+1;//注意*****
               这两者有什么区别,为什么前者一直wa呐?
     
     
     
    kmp代码:
    #include<stdio.h>
    #include<string.h>
    #include<stdlib.h>
    #define MAX(x,y)(x>y?x:y)
    const int MAXN=1000010;
    char mstr[MAXN];
    char str[110];
    struct Node{
        int s,e;
    };
    Node area[MAXN];
    int cmp(const void *a,const void *b){
        if((*(Node *)a).e!=(*(Node *)b).e)return (*(Node *)a).e-(*(Node *)b).e;
        else return (*(Node *)a).s-(*(Node *)b).s;
    }
    int p[110],top;
    void getp(){
        int i=0,j=-1;
        p[0]=-1;
        while(str[i]){
            if(j==-1||str[i]==str[j]){
                i++;j++;
                p[i]=j;
            }
            else j=p[j];
        }
    }
    void kmp(){
        getp();
        int i=0,j=0;
        while(mstr[i]){
            if(j==-1||mstr[i]==str[j]){
                i++;j++;
                if(!str[j])area[top].s=i-j,area[top++].e=i-1;
            }
            else j=p[j];
        }
    }
    int main(){
        int N;
        while(~scanf("%s",mstr)){
            top=0;
            scanf("%d",&N);
            for(int i=0;i<N;i++){
                scanf("%s",str);
                kmp();
            }
            int ans=0;
            int n=strlen(mstr),t=0,temp;
            area[top].s=n;area[top].e=n;
            qsort(area,top+1,sizeof(area[0]),cmp);
            //for(int i=0;i<=top;i++)printf("%d %d
    ",area[i].s,area[i].e);
            for(int i=0;i<=top;i++){
                temp=area[i].e-t;
                ans=MAX(ans,temp);
                t=area[i].s+1;//注意***** 
            }
            printf("%d
    ",ans);
        }
        return 0;
    }


    str函数:

     1 #include<stdio.h>
     2 #include<string.h>
     3 #include<stdlib.h>
     4 #define MAX(x,y)(x>y?x:y)
     5 const int MAXN=1000010;
     6 char mstr[MAXN];
     7 char str[110];
     8 struct Node{
     9     int s,e;
    10 };
    11 Node area[MAXN];
    12 int cmp(const void *a,const void *b){
    13     if((*(Node *)a).e!=(*(Node *)b).e)return (*(Node *)a).e-(*(Node *)b).e;
    14     else return (*(Node *)a).s-(*(Node *)b).s;
    15 }
    16 int top;
    17 int main(){
    18     int N;
    19     while(~scanf("%s",mstr)){
    20         top=0;
    21         scanf("%d",&N);
    22         for(int i=0;i<N;i++){
    23             scanf("%s",str);
    24             int len=strlen(str),c=0;
    25             while(strstr(mstr+c,str)){
    26                 area[top].s=strstr(mstr+c,str)-mstr;
    27                 area[top].e=area[top].s+len-1;
    28                 c=area[top].s+len-1;
    29                 top++;
    30             }
    31         }
    32         int ans=0;
    33         int n=strlen(mstr),t=0,temp;
    34         area[top].s=n;area[top].e=n;
    35         qsort(area,top+1,sizeof(area[0]),cmp);
    36         //for(int i=0;i<=top;i++)printf("%d %d
    ",area[i].s,area[i].e);
    37         for(int i=0;i<=top;i++){
    38             temp=area[i].e-t;
    39             ans=MAX(ans,temp);
    40             t=area[i].s+1;
    41         }
    42         printf("%d
    ",ans);
    43     }
    44     return 0;
    45 }
    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<cmath>
    #include<algorithm>
    using namespace  std;
    typedef long long LL;
    #define mem(x,y) memset(x,y,sizeof(x))
    #define SI(x) scanf("%d",&x)
    #define PI(x) printf("%d",x)
    #define P_ printf(" ")
    const int INF=0x3f3f3f3f;
    const int MAXN=1e6+100;
    char mstr[MAXN];
    int p[MAXN];
    char s[MAXN];
    typedef struct Node{
    	int s,t;
    	bool operator < (const Node &b)const{
    		if(t!=b.t)return t<b.t;
    		else return s<b.s;
    	}
    };
    Node dt[MAXN];
    int tp;
    void getp(){
    	int i=0,j=-1;
    	p[0]=-1;
    	while(s[i]){
    		if(j==-1||s[i]==s[j]){
    			i++;j++;
    			p[i]=j;
    		}
    		else j=p[j];
    	}
    }
    
    void kmp(){
    	getp();
    	int j=0,i=0;
    	while(mstr[i]){
    		if(j==-1||s[j]==mstr[i]){
    			i++;j++;
    			if(!s[j]){
    				dt[tp].s=i-j;dt[tp++].t=i-1;
    			}
    		}
    		else j=p[j];
    	}
    }
    
    int main(){
    	while(~scanf("%s",mstr)){
    		int N;
    		SI(N);
    		tp=1;
    		dt[0].s=0;
    		dt[0].t=0;
    		int len=strlen(mstr);
    		while(N--){
    			scanf("%s",s);
    			kmp();
    		}
    		dt[tp].s=len;dt[tp].t=len;
    		sort(dt+1,dt+tp+1);
    		int t=0,ans=0,temp;
    		for(int i=1;i<=tp;i++){
    		//	ans=max(dt[i].t-dt[i-1].s-1,ans);
    			
    			temp=dt[i].t-t;
                ans=max(ans,temp);
                t=dt[i].s+1;//注意***** 
                
    		}
    		printf("%d
    ",ans);
    	}
    	return 0;
    }
    

      

    人之初,性本善,性相近,习相远。苟不教,性乃迁,教之道,贵以专。   

    昔孟母,择邻处,子不学,断机杼。窦燕山,有义方,教五子,名俱扬。   

    养不教,父之过,教不严,师之惰。子不学,非所宜,幼不学,老何为?   

    玉不琢,不成器,人不学,不知义。为人子,方少时,亲师友,习礼仪。   

    香九龄,能温席,孝于亲,所当执。融四岁,能让梨,弟于长,宜先知。   

    首孝悌,次见闻,知某数,识某文。一而十,十而百,百而千,千而万。   

    三才者,天地人,三光者,日月星。三纲者,君臣义,父子亲,夫妇顺。   

    曰春夏,曰秋冬,此四时,运不穷。曰南北,曰西东,此四方,应乎中。   

    曰水火,木金土,此五行,本乎数。十干者,甲至癸。十二支,子至亥。   

    曰黄道,日所躔。曰赤道,当中权。赤道下,温暖极。我中华,在东北。   

    曰江河,曰淮济。此四渎,水之纪。曰岱华,嵩恒衡。此五岳,山之名。   

    曰士农,曰工商。此四民,国之良。曰仁义,礼智信,此五常,不容紊。   

    地所生,有草木。此植物,遍水陆。有虫鱼,有鸟兽。此动物,能飞走。   

    稻粱菽,麦黍稷。此六谷,人所食。马牛羊,鸡犬豕。此六畜,人所饲。   

    曰喜怒,曰哀惧,爱恶欲,七情具。青赤黄,及白黑,此五色,目所识。   

    酸苦甘,及辛咸,此五味,口所含。膻焦香,及腥朽,此五臭,鼻所嗅。   

    匏土革,木石金,丝与竹,乃八音。曰平上,曰去入,此四声,宜调协。   

    高曾祖,父而身,身而子,子而孙。自子孙,至玄曾,乃九族,人之伦。   

    父子恩,夫妇从,兄则友,弟则恭;长幼序,友与朋,君则敬,臣则忠。   

    此十义,人所同,当顺叙,勿违背。斩齐衰,大小幼。至缌麻,五服终。   

    礼乐射,御书数,古六艺,今不具。唯书学,人共遵,既识字,讲说文。   

    有古文,大小篆,隶草继,不可乱。   

    若广学,惧其繁,但略说,能知源。凡训蒙,须讲究,详训诂,明句读。   

    为学者,必有初,小学终,至四书。论语者,二十篇,群弟子,记善言。   

    孟子者,七篇止,讲道德,说仁义。作中庸,子思笔,中不偏,庸不易。   

    作大学,乃曾子,自修齐,至平治。孝经通,四书熟,如六经,始可读。   

    诗书易,礼春秋,号六经,当讲究。有连山,有归藏,有周易,三易详。   

    有典谟,有训诰,有誓命,书之奥。我周公,作周礼,著六官,存治体。   

    大小戴,注礼记,述圣言,礼乐备。曰国风,曰雅颂,号四诗,当讽咏。   

    诗既亡,春秋作,寓褒贬,别善恶。三传者,有公羊,有左氏,有谷梁。   

    经既明,方读子,撮其要,记其事。五子者,有荀扬,文中子,及老庄。   

    经子通,读诸史,考世系,知终始。自羲农,至黄帝,号三皇,居上世。   

    唐有虞,号二帝,相揖逊,称盛世。夏有禹,商有汤,周文武,称三王。   

    夏传子,家天下,四百载,迁夏社。汤伐夏,国号商,六百载,至纣亡。   

    周武王,始诛纣,八百载,最长久。周辙东,王纲坠,逞干戈,尚游说。   

    始春秋,终战国,五霸强,七雄出。蠃秦氏,始兼并,传二世,楚汉争。   

    高祖兴,汉业建,至孝平,王莽篡。光武兴,为东汉,四百年,终于献。   

    魏蜀吴,争汉鼎,号三国,迄两晋。宋齐继,梁陈承,为南朝,都金陵。   

    北元魏,分东西,宇文周,与高齐。迨至隋,一土宇,不再传,失统绪。   

    唐高祖,起义师,除隋乱,创国基。二十传,三百载,梁灭之,国乃改。   

    梁唐晋,及汉周,称五代,皆有由。炎宋兴,受周禅。十八传,南北混。   

    辽与金,皆称帝,元灭金,绝宋世。舆图广,超前代,九十载,国祚废。   

    太祖兴,国大明,号洪武,都金陵。迨成祖,迁燕京,十六世,至崇祯。  

    权阉肆,寇如林,李闯出,神器焚。清世祖,膺景命,靖四方,克大定。   

    由康雍,历乾嘉。民安富,治绩夸。道咸间,变乱起。始英法,扰都鄙。   

    同光后,宣统弱。传九帝,满清殁。革命兴,废帝制。立宪法,建民国。   

    古今史,全在兹。载治乱,知兴衰。史虽繁,读有次。史记一,汉书二。   

    后汉三,国志四。兼证经,参通鉴。读史者,考实录,通古今,若亲目。   

    口而诵,心而惟,朝于斯,夕于斯。昔仲尼,师项橐,古圣贤,尚勤学。   

    赵中令,读鲁论,彼既仕,学且勤。彼蒲编,削竹简,彼无书,且知勉。   

    头悬梁,锥刺股,彼不教,自勤苦。如囊萤,如映雪,家虽贫,学不辍。   

    如负薪,如挂角,身虽劳,犹苦卓。苏老泉,二十七,始发愤,读书籍。   

    彼既老,犹悔迟,尔小生,宜早思。若梁灏,八十二,对大廷,魁多士。   

    彼既成,众称异,尔小生,宜立志。莹八岁,能咏诗,泌七岁,能赋棋。   

    彼颖悟,人称奇,尔幼学,当效之。蔡文姬,能辨琴,谢道韫,能咏吟。   

    彼女子,且聪敏,尔男子,当自警。唐刘晏,方七岁,举神童,作正字。   

    彼虽幼,身已仕,尔幼学,勉而致。有为者,亦若是。   

    犬守夜,鸡司晨,苟不学,曷为人?蚕吐丝,蜂酿蜜,人不学,不如物。   

    幼而学,壮而行,上致君,下泽民。扬名声,显父母,光于前,裕于后。   

    人遗子,金满籯,我教子,惟一经。勤有功,戏无益,戒之哉,宜勉力。

  • 相关阅读:
    【ICLR2018】Mixup 解读
    MobileNetV2 解读
    MobileNetV1 解读
    AdaIN 解读
    心灵奇旅
    SA-Net: Shuffle Attention for Deep Convolutional Neural Networks
    ShuffleNet V1 解读
    情人节看《唐探3》
    拆弹人
    内卷常态下的就业烦恼
  • 原文地址:https://www.cnblogs.com/handsomecui/p/4764736.html
Copyright © 2020-2023  润新知