HDU 1867 KMP 求最大尾部重叠
2013-12-16 19:54
316 查看
题意:
给定2个字符串,a-b 或 b-a
尾部相同部分只输出一次
求长度最小的字符串(长度相同则字典序最小)
给定2个字符串,a-b 或 b-a
尾部相同部分只输出一次
求长度最小的字符串(长度相同则字典序最小)
#include<stdio.h> #include<string.h> #include<iostream> #include<algorithm> using namespace std; #define N 200050 int f1 , f2 ; char s1 , s2 ; void getFail(int *f, char *s){ int i, j, len = strlen(s); j = f[0] = -1; i = 0; while(i < len) { while(j!=-1 && s[i] != s[j])j = f[j]; i++, j++; if(s[i] != s[j])f[i] = j; else f[i] = f[j]; } } int KMP(int *f, char *S1, char *S2){ int pos = 0, len = strlen(S1), j = 0, i = 0; while(i <= len) { while(j!=-1 && S1[i] != S2[j]) j = f[j]; i++, j++; if(i == len)pos = max(pos, j); } return pos; } void go(char *S1, char *S2, int pos){ int i = strlen(S1); while(S2[pos]) S1[i++] = S2[pos++]; S1[i] = '\0'; } char tmp1 , tmp2 , as1 , as2 ; int main(){ while(~scanf("%s %s", s1, s2)){ getFail(f1, s1); getFail(f2, s2); int ans1 = KMP(f2, s1, s2), ans2 = KMP(f1, s2, s1); if(ans1>ans2) { go(s1, s2, ans1); printf("%s\n",s1); } else if(ans1<ans2) { go(s2, s1, ans2); printf("%s\n",s2); } else { memcpy(tmp1, s1, sizeof(s1)); memcpy(tmp2, s2, sizeof(s1)); go(tmp1, tmp2, ans1); memcpy(as1, tmp1, sizeof(as1)); memcpy(tmp1, s1, sizeof(s1)); memcpy(tmp2, s2, sizeof(s1)); go(tmp2, tmp1, ans1); memcpy(as2, tmp2, sizeof(as1)); if(strcmp(as1, as2) < 0) printf("%s\n",as1); else printf("%s\n",as2); } } return 0; } /* asdf sdfg asdf ghjk aa aa asdf sd asdf df aabbcc ccbbaa aabbcdc fdssbbaa sadsffxcvrg asdfrxccverasd asdfrxccverasd sadsffxcvrg */
相关文章推荐
- HDU 1024 (不重叠m段最大和) Max Sum Plus Plus
- HDU 1867 KMP
- hdu 1867(A + B for you again) KMP的应用 /hdu 2594(Simpsons’ Hidden Talents) KMP
- HDU 2087 剪花布条【KMP,子串出现次数,不可重叠】
- HDU 3374 String Problem(最小最大表示法+KMP)
- HDU 3374 KMP 最大表示法 最小表示法
- HDU 1867 KMP
- HDU 1867 KMP
- HDU 1867 A + B for you again(KMP)
- HDU 5442 (串的最大表示+KMP)
- HDU 1867 A + B for you again ----KMP
- Hdu 5442 Favorite Donut (2015 ACM/ICPC Asia Regional Changchun Online 最大最小表示法 + KMP)
- hdu 1867 kmp共工前后缀串问题
- hdu 3374 String Problem (字符串最小最大表示 + KMP求循环节)
- [HDU 5443]Favorite Donut[KMP][最大表示]
- hdu 1867 KMP
- HDU - 5442 Favorite Donut 最大表示法+KMP || 后缀数组
- HDU 1867 A + B for you again(KMP:后缀与前缀)
- HDU 5442 Favorite Donut 最大表示法+KMP
- hdu 1867 Cow Patterns kmp模板