HDU 2594
来源:互联网 发布:oracle数据库跟踪工具 编辑:程序博客网 时间:2024/05/29 18:22
题目的意思是有两个字符串a,b。 a的最大前缀和b的最大后缀相同几个。 刚开始看题目以为只要先把两个字符串连接一下,然后next数组修改一下就可以后来发现并不对,因为有可能前缀会包含到另一个字符串中。所以只要把第二个字符串当作原串,第一个当作模式串,通过kmp找相同的就可以了。
(不要嘲笑我代码写的难看)!!!!
#include <algorithm>#include <iostream>#include <iomanip>#include <cstring>#include <cstdlib>#include <cstdio>#include <string>#include <vector>#include <queue>#include <cmath>#include <stack>#include <map>#include <cmath>#include <set>#include <climits>#define INF 0x7fffffff#define finc(i,a,b) for(i=a;i<=b;i++)#define fdec(i,a,b) for(i=a;i>=b;i--)using namespace std;char s[60000],p[60000];int next[60000];void getnext(char *p,int *next){int i=0,j=-1;next[0]=-1; int c=strlen(p); while(i<c) { if(j==-1||p[i]==p[j]) { i++; j++; next[i]=j; } else j=next[j]; }}int kmp(char *s,char *p){int i=0,j=0;getnext(p,next);int c=strlen(s);int m=strlen(p);while(i<c){if(j==-1||s[i]==p[j]){i++;j++;}elsej=next[j];}if(i==c&&j>0){ return j;}elsereturn -1;}int main(){int i,j;while(~scanf("%s",s)){scanf("%s",p);int n=kmp(p,s);if(n==-1)printf("0\n");else{for(i=0;i<n;i++){if(i==n-1)printf("%c ",s[i]);elseprintf("%c",s[i]);}printf("%d\n",n);}}return 0;}
0 0
- hdu 2594
- hdu 2594
- hdu 2594
- HDU 2594
- hdu 2594
- HDU 2594
- HDU 2594
- hdu 2594
- hdu 2594
- 两个kmp hdu 2594 & hdu 2087
- HDU 2594 子序列
- 【HDU 2594 KMP】
- hdu 2594 kmp
- hdu kmp 2594
- HDU 2594 kmp
- HDU 2594 (KMP入门)
- HDU 2594 (KMP)
- HDU 2594 (KMP)
- C读txt到二维数组
- MySQL查找SQL耗时瓶颈 SHOW profiles
- 虚拟机中装(重装)VMWare_Tools
- HTTP协议分析系列(三)------HTTP协议方法和状态码
- Windows下用Putty管理VMware Workstation 虚拟机中安装的Ubuntu12.04 LTS
- HDU 2594
- js实现瀑布流
- 向C语言致敬,码农最后的遮羞布。
- 新浪新闻评论系统的架构演进和经验总结
- C++读取文本文件中以TAB作为分隔符,且中间字段有为空的情况的方法?
- OC--继承封装和多态
- git reset rebase
- iOS 支付宝SDK下载
- 程序员的 59 条搞笑但却真实无比的编程语录