标签:style blog http io ar color os sp for
题意:
找出这些串中最长的公共子串(长度≥3),如果长度相同输出字典序最小的那个。
分析:
用库函数strstr直接查找就好了,用KMP反而是杀鸡用牛刀。
1 #include <cstdio> 2 #include <cstring> 3 4 char a[15][70], sub[70]; 5 int p[70], l; 6 7 int cmp(int p1, int p2) 8 { 9 for(int i = 0; i < l; ++i) 10 if(a[0][p1 + l] > a[0][p2 + l]) return p2; 11 return p1; 12 } 13 14 int main(void) 15 { 16 //freopen("3080in.txt", "r", stdin); 17 int T; 18 scanf("%d", &T); 19 while(T--) 20 { 21 int n, cnt = 0; 22 scanf("%d", &n); 23 for(int i = 0; i < n; ++i) scanf("%s", a[i]); 24 25 for(l = 60; l >= 3; --l) 26 { 27 cnt = 0; 28 for(int pos = 0; pos <= 60 - l; ++pos) 29 { 30 char temp = a[0][pos + l]; 31 a[0][pos + l] = ‘\0‘; 32 bool flag = true; 33 for(int i = 1; i < n; ++i) 34 { 35 if(strstr(a[i], a[0] + pos) == NULL) 36 { 37 flag = false; 38 break; 39 } 40 if(!flag) break; 41 } 42 a[0][pos + l] = temp; 43 if(flag) 44 p[cnt++] = pos; 45 } 46 if(cnt > 0) break; 47 } 48 49 if(cnt == 0) 50 { 51 puts("no significant commonalities"); 52 continue; 53 } 54 55 int min = p[0]; 56 for(int i = 1; i < cnt; ++i) min = cmp(min, p[i]); 57 a[0][min + l] = ‘\0‘; 58 printf("%s\n", a[0] + min); 59 } 60 61 return 0; 62 }
标签:style blog http io ar color os sp for
原文地址:http://www.cnblogs.com/AOQNRMGYXLMV/p/4123723.html