POJ 3080 Blue Jeans

这道题是字符串的简单题,主要是为了熟悉四个函数的用法:

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;

}

 

 

 

你可能感兴趣的:(poj)