这道题是字符串的简单题,主要是为了熟悉四个函数的用法:
strcpy:字串复制
原型:char *strcpy(char *dest, char *src);
功能:把src所指由'\0'结束的字符串复制到dest所指的数组中。
strncpy:字串复制
原型:char * strncpy(char *dest, char *src, size_t n);
功能:将字符串src中最多n个字符复制到字符数组dest中(它并不像strcpy一样只有遇到NULL才
停止复制,而是多了一个条件停止,就是说如果复制到第n个字符还未遇到NULL,也一样停止),
返回指向dest的指针。
函数名: strstr
函数原型:extern char *strstr(char *str1, char *str2);
功能:找出str2字符串在str1字符串中第一次出现的位置(不包括str2的串结束符)。
返回值:返回该位置的指针,如找不到,返回空指针。
还有一个是我们很熟悉的strcmp,用这四个函数就可以解决这道题了。
/*Accepted 168K 0MS C++ 1056B 2012-07-31 11:30:29*/ #include<stdio.h> #include<string.h> #include<stdlib.h> const int MAXN = 1 << 4; const int MAXL = 1 << 6; char src[MAXN][MAXL], buf[MAXL], res[MAXL], n; bool find() { int i, j, k, ans = 2; for(j = 60; j > ans; j --) //枚举子串长度 { for(i = 0; i <= 60 - j; i ++) //枚举子串在第一个字符串中的起始位置 { strncpy(buf, src[0] + i, j); buf[j] = 0; if(j > ans || strcmp(buf, res) < 0) { for(k = 1; k < n; k ++) { if(!strstr(src[k], buf)) break; } if(n == k) ans = j, strcpy(res, buf); } } } return ans > 2; } int main() { int T; scanf("%d", &T); while(T --) { scanf("%d", &n); for(int i = 0; i < n; i ++) scanf("%s", src[i]); if(!find()) printf("no significant commonalities\n"); else puts(res); } return 0; }