Problem 2128 最长子串(kmp+strstr好题经典)
Accept: 134 Submit: 523
Time Limit: 3000 mSec Memory Limit : 65536 KB
Problem Description
Input
输入包含多组数据。第一行为字符串s,字符串s的长度1到10^6次方,第二行是字符串s不能包含的子串个数n,n<=1000。接下来n行字符串,长度不大于100。
字符串由小写的英文字符组成。
Output
Sample Input
Sample Output
temp=dt[i].t-t;
ans=max(ans,temp);
t=dt[i].s+1;//注意*****
这两者有什么区别,为什么前者一直wa呐?
#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\n",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\n",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\n",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\n",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\n",ans);}return 0;
}
人之初,性本善,性相近,习相远。苟不教,性乃迁,教之道,贵以专。
昔孟母,择邻处,子不学,断机杼。窦燕山,有义方,教五子,名俱扬。
养不教,父之过,教不严,师之惰。子不学,非所宜,幼不学,老何为?
玉不琢,不成器,人不学,不知义。为人子,方少时,亲师友,习礼仪。
香九龄,能温席,孝于亲,所当执。融四岁,能让梨,弟于长,宜先知。
首孝悌,次见闻,知某数,识某文。一而十,十而百,百而千,千而万。
三才者,天地人,三光者,日月星。三纲者,君臣义,父子亲,夫妇顺。
曰春夏,曰秋冬,此四时,运不穷。曰南北,曰西东,此四方,应乎中。
曰水火,木金土,此五行,本乎数。十干者,甲至癸。十二支,子至亥。
曰黄道,日所躔。曰赤道,当中权。赤道下,温暖极。我中华,在东北。
曰江河,曰淮济。此四渎,水之纪。曰岱华,嵩恒衡。此五岳,山之名。
曰士农,曰工商。此四民,国之良。曰仁义,礼智信,此五常,不容紊。
地所生,有草木。此植物,遍水陆。有虫鱼,有鸟兽。此动物,能飞走。
稻粱菽,麦黍稷。此六谷,人所食。马牛羊,鸡犬豕。此六畜,人所饲。
曰喜怒,曰哀惧,爱恶欲,七情具。青赤黄,及白黑,此五色,目所识。
酸苦甘,及辛咸,此五味,口所含。膻焦香,及腥朽,此五臭,鼻所嗅。
匏土革,木石金,丝与竹,乃八音。曰平上,曰去入,此四声,宜调协。
高曾祖,父而身,身而子,子而孙。自子孙,至玄曾,乃九族,人之伦。
父子恩,夫妇从,兄则友,弟则恭;长幼序,友与朋,君则敬,臣则忠。
此十义,人所同,当顺叙,勿违背。斩齐衰,大小幼。至缌麻,五服终。
礼乐射,御书数,古六艺,今不具。唯书学,人共遵,既识字,讲说文。
有古文,大小篆,隶草继,不可乱。
若广学,惧其繁,但略说,能知源。凡训蒙,须讲究,详训诂,明句读。
为学者,必有初,小学终,至四书。论语者,二十篇,群弟子,记善言。
孟子者,七篇止,讲道德,说仁义。作中庸,子思笔,中不偏,庸不易。
作大学,乃曾子,自修齐,至平治。孝经通,四书熟,如六经,始可读。
诗书易,礼春秋,号六经,当讲究。有连山,有归藏,有周易,三易详。
有典谟,有训诰,有誓命,书之奥。我周公,作周礼,著六官,存治体。
大小戴,注礼记,述圣言,礼乐备。曰国风,曰雅颂,号四诗,当讽咏。
诗既亡,春秋作,寓褒贬,别善恶。三传者,有公羊,有左氏,有谷梁。
经既明,方读子,撮其要,记其事。五子者,有荀扬,文中子,及老庄。
经子通,读诸史,考世系,知终始。自羲农,至黄帝,号三皇,居上世。
唐有虞,号二帝,相揖逊,称盛世。夏有禹,商有汤,周文武,称三王。
夏传子,家天下,四百载,迁夏社。汤伐夏,国号商,六百载,至纣亡。
周武王,始诛纣,八百载,最长久。周辙东,王纲坠,逞干戈,尚游说。
始春秋,终战国,五霸强,七雄出。蠃秦氏,始兼并,传二世,楚汉争。
高祖兴,汉业建,至孝平,王莽篡。光武兴,为东汉,四百年,终于献。
魏蜀吴,争汉鼎,号三国,迄两晋。宋齐继,梁陈承,为南朝,都金陵。
北元魏,分东西,宇文周,与高齐。迨至隋,一土宇,不再传,失统绪。
唐高祖,起义师,除隋乱,创国基。二十传,三百载,梁灭之,国乃改。
梁唐晋,及汉周,称五代,皆有由。炎宋兴,受周禅。十八传,南北混。
辽与金,皆称帝,元灭金,绝宋世。舆图广,超前代,九十载,国祚废。
太祖兴,国大明,号洪武,都金陵。迨成祖,迁燕京,十六世,至崇祯。
权阉肆,寇如林,李闯出,神器焚。清世祖,膺景命,靖四方,克大定。
由康雍,历乾嘉。民安富,治绩夸。道咸间,变乱起。始英法,扰都鄙。
同光后,宣统弱。传九帝,满清殁。革命兴,废帝制。立宪法,建民国。
古今史,全在兹。载治乱,知兴衰。史虽繁,读有次。史记一,汉书二。
后汉三,国志四。兼证经,参通鉴。读史者,考实录,通古今,若亲目。
口而诵,心而惟,朝于斯,夕于斯。昔仲尼,师项橐,古圣贤,尚勤学。
赵中令,读鲁论,彼既仕,学且勤。彼蒲编,削竹简,彼无书,且知勉。
头悬梁,锥刺股,彼不教,自勤苦。如囊萤,如映雪,家虽贫,学不辍。
如负薪,如挂角,身虽劳,犹苦卓。苏老泉,二十七,始发愤,读书籍。
彼既老,犹悔迟,尔小生,宜早思。若梁灏,八十二,对大廷,魁多士。
彼既成,众称异,尔小生,宜立志。莹八岁,能咏诗,泌七岁,能赋棋。
彼颖悟,人称奇,尔幼学,当效之。蔡文姬,能辨琴,谢道韫,能咏吟。
彼女子,且聪敏,尔男子,当自警。唐刘晏,方七岁,举神童,作正字。
彼虽幼,身已仕,尔幼学,勉而致。有为者,亦若是。
犬守夜,鸡司晨,苟不学,曷为人?蚕吐丝,蜂酿蜜,人不学,不如物。
幼而学,壮而行,上致君,下泽民。扬名声,显父母,光于前,裕于后。
人遗子,金满籯,我教子,惟一经。勤有功,戏无益,戒之哉,宜勉力。
Problem 2128 最长子串(kmp+strstr好题经典)相关推荐
- Leecode03. 无重复字符的最长子串——Leecode大厂热题100道系列
我是小张同学,立志用最简洁的代码做最高效的表达 以下是我个人做的题解,每个题都尽量囊括了所有解法,并做到了最优解,欢迎大家收藏!留言! 传送门-->Leecode大厂热题100道系列题解 问题描 ...
- php无重复字符的最长子串,PHP算法之无重复字符的最长子串
给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度. 示例 1: 输入: "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc&qu ...
- 最长子串(FZU2128)
最长子串 Time Limit:3000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u Submit Status ...
- fuz--2128(最长子串)
最长子串 Accept: 130 Submit: 516 Time Limit: 3000 ...
- 【每日一算法】无重复字符的最长子串
微信改版,加星标不迷路! 每日一算法 - 无重复字符的最长子串 思路答案 首先定义一个指针p指向该字符串的链头,然后通过p指针后的第i个字符是否和p指针后的第j个字符相同来取得最大长度.(也叫做完全遍 ...
- LeetCode Algorithm 3. 无重复字符的最长子串
3. 无重复字符的最长子串 Ideas 这题有点KMP那味了. 首先定义三个变量: left:-1,当前处理字符串长度的左索引的前一位 res:0,最长子串长度 idx:{},最长子串中每个字符出现的 ...
- 计算重叠最长子串问题
问题:给定两个字符串,求它们前后重叠的最长子串的长度,比如"abcde"和"cdefg"是"cde",长度为3. 输入: 输入可能包 ...
- 【leetcode】力扣刷题(3):无重复字符的最长子串(go语言)
一.问题描述 给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度. 示例 1: 输入: "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 " ...
- leetcode--无重复字符的最长子串--python
文章目录 题目 题目详情 示例 解题代码 思路 代码 运行结果 最佳方案 题目 题目详情 给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度. 示例 输入: "abcabcbb& ...
最新文章
- Oracle 数据库名、实例名、服务名详解
- 【Deep Learning笔记】常用的激活函数
- MySQL 中NULL和空值的区别
- ubuntu16.04安装opencv3.1.0(包含opencv_contrib模块)
- 3,外键之表关联关系,修改表,复制表
- mysql 时间 本周 本月_不要再等了,储蓄国债发行又被取消,本周还有两批国债能不能买...
- java中list方法addall怎么写_简历中个人优势怎么写?| 四大方法教你打造独一无二“个人标签”...
- window.open在Safari浏览器出现的问题
- Android中gravity与layout_gravity的区别--Padding 与 margin 区别
- java sql插入_java 中如何使用sql插入语句?
- 力克亮相CISMA 2017,以工业4.0思维应对时尚变革
- 老罗与西门子的公关战争
- shell脚本:备份数据库、代码上线
- 天道酬勤,记春招之路(完美世界,360,腾讯IEG,网易雷火)
- 学习 Python 数学模块之 为什么我们需要使用数学模块
- BlazePose: On-device Real-time Body Pose tracking
- 斗战神服务器正在维护6,17173《斗战神》专区——3月15日维护公告:疲劳刷新改为每天6点...
- POJ 1076 Bowl 笔记
- python爬虫《向往的生活》豆瓣短评,来看看Henry大华的路人评价变化~
- Android 输入法框架流程整理