#include <stdio.h> #include <stdlib.h> #include <string.h> #define N 512 int pstrcmp(const void *a, const void *b) { return strcmp(*(char **)a, *(char **)b); } int cmplen(const char *p, const char *q) { int i = 0; while (*p && *p++ == *q++) i++; return i; } int cmplen3(const char *p, const char *q, const char *r) { int i = 0; while (*p && *p == *q && *p == *r) { p++, q++, r++; i++; } return i; } struct node{ char * s; unsigned char flag; }; int nodecmp(const void *a, const void *b) { struct node * p = (struct node *)a; struct node * q = (struct node *)b; return strcmp(p->s, q->s); } int pnodecmp(const void *a, const void *b) { return strcmp((*(struct node **)a)->s, (*(struct node **)b)->s); } //最长公共字串,最长回文字串,后缀数组 int main() { char s1[N]; char s2[N]; char s3[N]; struct node b[N]; struct node *a[N]; for (int i = 0; i < N; i++) a[i] = &b[i]; scanf("%s", s1); int len1 = strlen(s1); for (int i = 0; i < len1; ++i) { a[i]->s = &s1[i]; a[i]->flag = 1; } //scanf("%s", &s[len1 + 1]); // "hello/0china/0" scanf("%s", s2); int len2 = strlen(s2); for (int i = 0; i < len2; i++) { a[len1 + i]->s = &s2[i]; a[len1 + i]->flag = 1 << 1; } scanf("%s", s3); int len3 = strlen(s3); for (int i = 0; i < len3; i++) { a[len1 + len2 + i]->s = &s3[i]; a[len1 + len2 + i]->flag = 1 << 2; } int len = len1 + len2 + len3; qsort(a, len, sizeof(struct node *), pnodecmp); for (int i = 0; i < len; i++) printf("%d/t%s/n", i, a[i]->s); puts("--------------------------------"); int maxlen = 0; int tmp = 0, maxi = 0; for (int i = 0; i < len - 2; i++) { printf("%d/t%s---%d/t%s---%d/t%s---%d/n", i, a[i]->s, a[i]->flag, a[i+1]->s, a[i+1]->flag, a[i+2]->s, a[i+2]->flag); unsigned char flag = ~(a[i]->flag | a[i+1]->flag | a[i+2]->flag) << 5; //保证元素来自不同的集合,此处可适应大于2个集合的情况,注意修改取反后移位的数值,3个集合时保留低3位的结果 printf("flag: %d/n", flag); if (flag == 0) { if ((tmp = cmplen3(a[i]->s, a[i+1]->s, a[i+2]->s)) > maxlen) { maxlen = tmp; maxi = i; } } } printf("the longest common substring is: %.*s/n", maxlen, a[maxi]->s); // for(int i = 0; i < len; i++) // { // a[i] = &s[i]; // } // qsort(a, len, sizeof(char *), pstrcmp); // for(int i = 0; i < len; i++) // { // puts(a[i]); // } system("pause"); return 0; }