HDU 2594 Simpsons’ Hidden Talents(简单KMP)
2017-07-27 17:18
429 查看
题目链接:hdu2594
题目大意:求最长的相同前缀和后缀(取第一个字符串的前缀和第二个字符串的后缀)
思路:因为s字符串的前缀匹配t字符串的后缀 所以把s作为匹配的字符串 求nexts
然后在kmp函数中,记录t字符串中第i个字符最多能匹配到s字符串的第几个
题目大意:求最长的相同前缀和后缀(取第一个字符串的前缀和第二个字符串的后缀)
思路:因为s字符串的前缀匹配t字符串的后缀 所以把s作为匹配的字符串 求nexts
然后在kmp函数中,记录t字符串中第i个字符最多能匹配到s字符串的第几个
#include <stdio.h> #include <algorithm> #include <iostream> #include <string.h> using namespace std; #define maxn 2000100 char s[maxn]; char t[maxn]; int nexts[maxn]; int n,m; int a[maxn]; void getnexts()//因为s字符串的前缀匹配t字符串的后缀 所以把s作为匹配的字符串 求nexts { int j=0; int k=-1; nexts[0]=-1; while(j<m) { if(k==-1||s[j]==s[k]) { j++;k++; nexts[j]=k; } else k=nexts[k]; } } int num[maxn]; void kmp() { int i=0,j=0; memset(num,0,sizeof num); while(i<n) { if(j==-1||t[i]==s[j]) { j++;i++; num[i]=j;//记录t中第i个字符最多能匹配到s字符串的第几个 } else j=nexts[j]; } } int main() { while(~scanf("%s%s",s,t)) { m=strlen(s); n=strlen(t); getnexts(); kmp(); if(num ==0)printf("0\n"); else { for(int i=0;i<num ;i++) printf("%c",s[i]); printf(" %d\n",num ); } } return 0; }
相关文章推荐
- HDU 2594 (简单KMP) Simpsons’ Hidden Talents
- HDU 2594 Simpsons’ Hidden Talents(KMP的Next数组应用)
- HDU 2594 Simpsons’ Hidden Talents(KMP)
- 【KMP】 HDU 2594 Simpsons’ Hidden Talents
- HDU 2594 Simpsons’ Hidden Talents (KMP)
- HDU 2594 Simpsons’ Hidden Talents(KMP)
- hdu 2594 Simpsons’ Hidden Talents(kmp)
- hdu 2594 Simpsons’ Hidden Talents 【KMP】
- HDU - 2594 Simpsons’ Hidden Talents(KMP)
- hdu 2594 Simpsons’ Hidden Talents(KMP)
- HDU 2594 Simpsons’ Hidden Talents(KMP)
- HDU 2594Simpsons’ Hidden Talents(KMP运用)
- |Hdu 2594|KMP|Simpsons’ Hidden Talents
- HDU-2594 Simpsons’ Hidden Talents(KMP)
- HDU 2594 Simpsons’ Hidden Talents (KMP)
- HDU 2594 Simpsons’ Hidden Talents (KMP——前缀后缀最长公共串)
- HDU 2594 Simpsons’ Hidden Talents(KMP,next数组的应用)
- hdu 2594 Simpsons’ Hidden Talents ( kmp )
- hdu 2594 Simpsons’ Hidden Talents(KMP)
- HDU 2594 Simpsons’ Hidden Talents(kmp)