HDU1867.cpp KMP中发生不匹配时,j=next[j],j的含义
2013-11-14 15:17
267 查看
#include<stdio.h> #include<string.h> #define size 100009 void getnext(char *p,int *next) { int i,j; next[0]=-1; i=0,j=-1; int len=strlen(p); while(i<len) { if(j==-1 || p[i]==p[j])i++,j++,next[i]=j; else j=next[j]; } } void kmp(char *s,char *p,int *next,char *ans) { int i,j; i=0,j=0; int l1=strlen(s); int l2=strlen(p); if(l1>l2) i=l1-l2; while(i<l1 && j<l2) { if(j==-1 || s[i]==p[j])i++,j++; else j=next[j]; } strcpy(ans,s); strcpy(ans+l1,p+j); } int main() { char s[size],t[size],ans1[size*2],ans2[size*2]; int next1[size],next2[size]; while(~scanf("%s%s",s,t)) { getnext(s,next1); getnext(t,next2); kmp(s,t,next2,ans1); kmp(t,s,next1,ans2); int l1=strlen(ans1); int l2=strlen(ans2); if(l1>l2) printf("%s\n",ans2); else if(l1<l2) printf("%s\n",ans1); else if(l1==l2) { if(strcmp(ans1,ans2)>0) printf("%s\n",ans2); else printf("%s\n",ans1); } } return 0; }
相关文章推荐
- ASP:当 request.cookies 发生 Microsoft VBScript 运行时错误 (0x800A000D) 类型不匹配: '[string:
- Stack的三种含义(数据超过栈的大小,就发生stack overflow)
- KMP算法-next数组的含义和求法
- POJ 1961 Period 还是next数组的含义、
- FindFirstFileW和FindNextFileW在unicode编译环境下发生堆破坏的问题!
- 比较程序集名称时发生了处理器结构不匹配: Ref x86,Def MSIL
- # include <errno.h >查看错误代码errno是调试程序的一个重要方法。当Linux C API函数发生异常时,一般会将errno变量赋值一个整数,不同的值表示不同的含义,可以通过查看
- 各中断含义、发生中断条件及解决方法记录
- 超详细理解:kmp算法next数组求解过程和回溯的含义
- POJ2752【KMP-next数组含义】
- POJ1961_Period_理解KMP中next数组的含义
- kernel源代码标记:mainline 、longterm、stable、linux-next、snapshot的含义
- printf输出%f %lld问题。输出类型和数据类型不匹配会发生什么?
- printf输出%f %lld问题。输出类型和数据类型不匹配会发生什么?
- POJ 3461 Oulipo 深刻理解KMP算法next数组含义
- Servlet中isCommitted含义及发生的条件
- Servlet中isCommitted含义及发生的条件
- kernel源代码标记:mainline 、longterm、stable、linux-next、snapshot的含义
- Android软键盘的含义IME_ACTION_NEXT
- poj2752之KMP_next的含义