标签:style blog class code java c
题目意思: 给出两个字符串a, b, 求最长的公共字串c, c是a的后缀,也是b的前缀. 本题没有具体说明哪个字符串是文本串和匹配串, 所以都要考虑
思路: 查找的时候, 当文本串结束的时候, 返回匹配串的位
1 /*************************************************************************
2 > File Name: 1867.cpp 3 > Author: Stomach_ache 4 > Mail: sudaweitong@gmail.com 5 > Created Time: 2014年05月15日 星期四 11时24分11秒 6 > Propose: 7 ************************************************************************/ 8 9 #include <cmath> 10 #include <string> 11 #include <cstdio> 12 #include <fstream> 13 #include <cstring> 14 #include <iostream> 15 #include <algorithm> 16 using namespace std; 17 #define MAX_N (100000+5) 18 19 char a[MAX_N], b[MAX_N]; 20 int f[MAX_N<<1]; 21 void getFail(char *); 22 23 int 24 find (char *T, char *P) { 25 int n = strlen(T);//m = strlen(P); 26 getFail(P); 27 int j = 0; 28 for (int i = 0; i < n; i++) { 29 while (j && T[i] != P[j]) j = f[j]; 30 if (P[j] == T[i]) j++; 31 } 32 33 return j; 34 } 35 36 void 37 getFail(char *P) { 38 int m = strlen(P); 39 f[0] = f[1] = 0; 40 for (int i = 1; i < m; i++) { 41 int j = f[i]; 42 while (j && P[i] != P[j]) j = f[j]; 43 f[i+1] = P[i] == P[j] ? j+1 : 0; 44 } 45 } 46 47 int 48 main(void) { 49 while (~scanf("%s %s", a, b)) { 50 // int len1 = strlen(a); 51 // int len2 = strlen(b); 52 int cnt = find(a, b); 53 // cout << cnt << endl; 54 int cnt2 = find(b, a); 55 // cout << cnt2 << endl; 56 if (cnt > cnt2) { 57 printf("%s", a); 58 printf("%s\n", b+cnt); 59 } else if (cnt < cnt2){ 60 printf("%s", b); 61 printf("%s\n", a+cnt2); 62 } else { 63 if (strcmp(a, b) < 0) { 64 printf("%s", a); 65 printf("%s\n", b+cnt); 66 } else { 67 printf("%s", b); 68 printf("%s\n", a+cnt2); 69 } 70 } 71 } 72 73 return 0; 74 }
标签:style blog class code java c
原文地址:http://www.cnblogs.com/Stomach-ache/p/3729777.html