POJ 3080 (字符串水题) Blue Jeans

题意:

找出这些串中最长的公共子串(长度≥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 } 
代码君

 

你可能感兴趣的:(字符串)