hdu 2594 Simpsons’ Hidden Talents(两个串的next数组)
2015-08-22 11:07
465 查看
题意:两个字符串s、t,求s和t的最长的相同的前缀和后缀
思路:先求s的next数组,再求t的next数组(即代码中ex数组,此时不是自己与自己匹配,而是与s匹配),最后看ex[len2]即可(len2为串t的长度)。
View Code
思路:先求s的next数组,再求t的next数组(即代码中ex数组,此时不是自己与自己匹配,而是与s匹配),最后看ex[len2]即可(len2为串t的长度)。
#include<iostream> #include<stdio.h> #include<string.h> using namespace std; #define MaxSize 50005 int _next[MaxSize],ex[MaxSize]; void GetNext(char t[]){//求next数组 int j,k,len; j=0; k=-1; _next[0]=-1; len=strlen(t); while(j<len){ if(k==-1||t[j]==t[k]){ ++j; ++k; _next[j]=k;//此句可由优化替代 /*优化(仅保证求KMPIndex时可用。谨慎使用。) if(t[j]!=t[k])next[j]=k; else next[j]=next[k]; */ } else k=_next[k]; } } void Get_ex(char s[],char t[]){//求ex数组 GetNext(s); int j,k,len; j=0; k=0; ex[0]=0; len=strlen(t); while(j<len){ if(k==-1||t[j]==s[k]){ ++j; ++k; ex[j]=k;//此句可由优化替代 /*优化(仅保证求KMPIndex时可用。谨慎使用。) if(t[j]!=t[k])next[j]=k; else next[j]=next[k]; */ } else k=_next[k]; } } int main(){ char str1[MaxSize],str2[MaxSize]; int i,len2; while(~scanf("%s%s",str1,str2)){ Get_ex(str1,str2);//求ex数组 len2=strlen(str2); if(ex[len2]==0)printf("0\n"); else{ for(i=0;i<ex[len2];++i) printf("%c",str1[i]); printf(" %d\n",ex[len2]); } } return 0; }
View Code
相关文章推荐
- Spring Filter components in auto scanning
- SublimeText 3中文输入
- 代理模式之cglib动态代理
- SVM入门
- Go操作mysql实现增删改查及连接池
- cal命令
- 好记星不如烂笔头!就从今天开始吧~
- java 金额转大写
- 怎样打开64位 Ubuntu 的32位支持功能?
- hdu 5414 CRB and String
- 单例、工厂模式简介
- Minimum Size Subarray Sum
- Linux NAT网络连接权威指南
- Struts(17)注释
- Linux NAT网络连接权威指南
- 怎样打开64位 Ubuntu 的32位支持功能?
- 怎样打开64位 Ubuntu 的32位支持功能?
- 用vlc SDK创建一个播放视频文件和RTSP流视频的Demo
- C中->和.的区别
- Linux下Bash的变量使用,echo,read,declare,typeset,array,