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代码:
  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=;
  6. char mstr[MAXN];
  7. char str[];
  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 p[],top;
  17. void getp(){
  18. int i=,j=-;
  19. p[]=-;
  20. while(str[i]){
  21. if(j==-||str[i]==str[j]){
  22. i++;j++;
  23. p[i]=j;
  24. }
  25. else j=p[j];
  26. }
  27. }
  28. void kmp(){
  29. getp();
  30. int i=,j=;
  31. while(mstr[i]){
  32. if(j==-||mstr[i]==str[j]){
  33. i++;j++;
  34. if(!str[j])area[top].s=i-j,area[top++].e=i-;
  35. }
  36. else j=p[j];
  37. }
  38. }
  39. int main(){
  40. int N;
  41. while(~scanf("%s",mstr)){
  42. top=;
  43. scanf("%d",&N);
  44. for(int i=;i<N;i++){
  45. scanf("%s",str);
  46. kmp();
  47. }
  48. int ans=;
  49. int n=strlen(mstr),t=,temp;
  50. area[top].s=n;area[top].e=n;
  51. qsort(area,top+,sizeof(area[]),cmp);
  52. //for(int i=0;i<=top;i++)printf("%d %d\n",area[i].s,area[i].e);
  53. for(int i=;i<=top;i++){
  54. temp=area[i].e-t;
  55. ans=MAX(ans,temp);
  56. t=area[i].s+;//注意*****
  57. }
  58. printf("%d\n",ans);
  59. }
  60. return ;
  61. }

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=;
  6. char mstr[MAXN];
  7. char str[];
  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=;
  21. scanf("%d",&N);
  22. for(int i=;i<N;i++){
  23. scanf("%s",str);
  24. int len=strlen(str),c=;
  25. while(strstr(mstr+c,str)){
  26. area[top].s=strstr(mstr+c,str)-mstr;
  27. area[top].e=area[top].s+len-;
  28. c=area[top].s+len-;
  29. top++;
  30. }
  31. }
  32. int ans=;
  33. int n=strlen(mstr),t=,temp;
  34. area[top].s=n;area[top].e=n;
  35. qsort(area,top+,sizeof(area[]),cmp);
  36. //for(int i=0;i<=top;i++)printf("%d %d\n",area[i].s,area[i].e);
  37. for(int i=;i<=top;i++){
  38. temp=area[i].e-t;
  39. ans=MAX(ans,temp);
  40. t=area[i].s+;
  41. }
  42. printf("%d\n",ans);
  43. }
  44. return ;
  45. }
  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<cmath>
  5. #include<algorithm>
  6. using namespace std;
  7. typedef long long LL;
  8. #define mem(x,y) memset(x,y,sizeof(x))
  9. #define SI(x) scanf("%d",&x)
  10. #define PI(x) printf("%d",x)
  11. #define P_ printf(" ")
  12. const int INF=0x3f3f3f3f;
  13. const int MAXN=1e6+100;
  14. char mstr[MAXN];
  15. int p[MAXN];
  16. char s[MAXN];
  17. typedef struct Node{
  18. int s,t;
  19. bool operator < (const Node &b)const{
  20. if(t!=b.t)return t<b.t;
  21. else return s<b.s;
  22. }
  23. };
  24. Node dt[MAXN];
  25. int tp;
  26. void getp(){
  27. int i=0,j=-1;
  28. p[0]=-1;
  29. while(s[i]){
  30. if(j==-1||s[i]==s[j]){
  31. i++;j++;
  32. p[i]=j;
  33. }
  34. else j=p[j];
  35. }
  36. }
  37.  
  38. void kmp(){
  39. getp();
  40. int j=0,i=0;
  41. while(mstr[i]){
  42. if(j==-1||s[j]==mstr[i]){
  43. i++;j++;
  44. if(!s[j]){
  45. dt[tp].s=i-j;dt[tp++].t=i-1;
  46. }
  47. }
  48. else j=p[j];
  49. }
  50. }
  51.  
  52. int main(){
  53. while(~scanf("%s",mstr)){
  54. int N;
  55. SI(N);
  56. tp=1;
  57. dt[0].s=0;
  58. dt[0].t=0;
  59. int len=strlen(mstr);
  60. while(N--){
  61. scanf("%s",s);
  62. kmp();
  63. }
  64. dt[tp].s=len;dt[tp].t=len;
  65. sort(dt+1,dt+tp+1);
  66. int t=0,ans=0,temp;
  67. for(int i=1;i<=tp;i++){
  68. // ans=max(dt[i].t-dt[i-1].s-1,ans);
  69.  
  70. temp=dt[i].t-t;
  71. ans=max(ans,temp);
  72. t=dt[i].s+1;//注意*****
  73.  
  74. }
  75. printf("%d\n",ans);
  76. }
  77. return 0;
  78. }

  

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Problem 2128 最长子串(kmp+strstr好题经典)的更多相关文章

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

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

  2. FZU 2128 最长子串

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

  3. 福州大学第十届校赛 & fzu 2128最长子串

    思路: 对于每个子串,求出 母串中 所有该子串 的 开始和结束位置,保存在 mark数组中,求完所有子串后,对mark数组按 结束位置排序,然后 用后一个的结束位置 减去 前一个的 开始 位置 再 减 ...

  4. Newtonsoft.Json C# Json序列化和反序列化工具的使用、类型方法大全 C# 算法题系列(二) 各位相加、整数反转、回文数、罗马数字转整数 C# 算法题系列(一) 两数之和、无重复字符的最长子串 DateTime Tips c#发送邮件,可发送多个附件 MVC图片上传详解

    Newtonsoft.Json C# Json序列化和反序列化工具的使用.类型方法大全   Newtonsoft.Json Newtonsoft.Json 是.Net平台操作Json的工具,他的介绍就 ...

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

    题目链接:option=com_onlinejudge&Itemid=8&page=show_problem&problem=3163">点击打开链接 题意: ...

  6. 算法练习之合并两个有序链表, 删除排序数组中的重复项,移除元素,实现strStr(),搜索插入位置,无重复字符的最长子串

    最近在学习java,但是对于数据操作那部分还是不熟悉 因此决定找几个简单的算法写,用php和java分别实现 1.合并两个有序链表 将两个有序链表合并为一个新的有序链表并返回.新链表是通过拼接给定的两 ...

  7. 最长子串(FZU2128)

    最长子串 Time Limit:3000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Submit Status  ...

  8. 九度OJ 1535 重叠的最长子串

    重叠的最长子串 http://ac.jobdu.com/problem.php?pid=1535 时间限制:1 秒 内存限制:128 兆 题目描述: 给定两个字符串,求它们前后重叠的最长子串的长度,比 ...

  9. [getLongestLength] 加和为0的最长子串长度

    点击这里查看原文 假设一个数组仅仅由1和-1组成,求该数组的和为0的最长子串的长度. 例如: {1,-1,1,-1,1,1,1} 输出:4. 昨天机试的时候做到这道题,不会做,今天思考一下. 普通的解 ...

随机推荐

  1. docker 数据管理<1>

    1. 挂载本地的目录到容器里: docker run -itd -v /data/:/data1 centos bash // -v 用来指定挂载目录, :前面的/data为本地目录,:后面的/dat ...

  2. vimTAB宽度等设置

    10 set shiftwidth=4 11 set softtabstop=4 12 set textwidth=200 13 set nu 14 set autoindent 15 set noe ...

  3. 在 Windows Azure 网站中进行纵向扩展和横向扩展

    编辑人员注释:本文章由 Windows Azure 网站团队的项目经理 Byron Tardif 撰写. 当您开始一个新的 Web 项目,或者刚刚开始开发一般的网站和应用程序时,您可能希望从小处着手. ...

  4. JavaScript压缩混淆 / 格式化 / 美化工具 - aTool在线工具

    原文地址:http://www.atool.org/jscompression.php

  5. ubuntu KDE/GNOME vnc

  6. linux学习之八-Linux本机性能监控

    Linux 优化 1.看看磁盘有没有满(根目录有没有满).内存有没有满.CPU有没有满 查看磁盘有没有满,使用df -h  看看磁盘使用情况 查看内存使用  free -m 特别关注swap用了多少 ...

  7. 30分钟学会使用grunt打包前端代码【mark】

    grunt 是一套前端自动化工具,一个基于nodeJs的命令行工具,一般用于:① 压缩文件② 合并文件③ 简单语法检查 对于其他用法,我还不太清楚,我们这里简单介绍下grunt的压缩.合并文件,初学, ...

  8. poj 2686 Traveling by Stagecoach ---状态压缩DP

    题意:给出一个简单带权无向图和起止点,以及若干张马车车票,每张车票可以雇到相应数量的马. 点 u, v 间有边时,从 u 到 v 或从 v 到 u 必须用且仅用一张车票,花费的时间为 w(u, v) ...

  9. 一个C/C++结构体初始化有趣的现象

    我们知道C语言当中结构可以使用{}进行初始化,例如有结构体定义如下: typedef struct type_t { int a; int b; int c; int d; }type_t; 我们可以 ...

  10. VS2010中xercesc配置及简单示例

    从官网下载xerces-c-3.1.1并解压,打开工程项目 xerces-c-3.1.1\projects\Win32\VC10\xerces-all\xerces-all.sln, 选择Xerces ...