您的位置:首页 > 理论基础 > 计算机网络

http://acm.hdu.edu.cn/showproblem.php?pid=1238

2013-06-04 19:59 459 查看
其实上就是给一系列的字符串,如果一个子串或者其反串在所有字符串中出现,那问题就解决了,输出这个子串的长度就可以了。问题规模小,那就简单,主要是问题规模增大之后,系统就会time limit exceeded,所以这道题主要是考察怎么取剪枝,达到优化的目的。

1、要找的子串的最大的长度肯定不会超过字符串序列中最小的长度

2、如果当前子串与其中一个不匹配,那就不用再找了,肯定结果也是不能完全匹配的。

参考代码

#include<cstdlib>

#include<iostream>

#include<cstdio>

#include<cstring>

using namespace std;

char str[101][101];

int main()

{

    int k,t,n,a,b;

    int maxn,min,len;

    scanf("%d",&t);

    while(t--)

    {

        maxn=0;

        min=k=101;

        scanf("%d",&n);

        for(int i=0; i<n; i++)

        {

            scanf("%s",&str[i]);

            len=strlen(str[i]);

            if(len<min)

            {

                min=len;

                k=i;

            }

        }

            for( a=0; a<min; a++)

            {

                for( b=1; (b<=min-a); b++)//从第一个字符开始一次增加数量。

                {

                    if(b<=maxn)continue;//找出子字符串。

                    char s1[101],s2[101];

                    strncpy(s1,str[k]+a,b);//拷贝给s1以便搜索。

                    s1[b]=s2[b]='\0';

                    for(int i=0; i<b; i++)

                        s2[i]=s1[b-i-1];//倒序与顺序均可。

                    bool x=true;

                    for(int i=0; x&&i<n; i++)

                    {

                        if(i==k)continue;

                        if(strstr(str[i],s1)==NULL&&strstr(str[i],s2)==NULL)//判断是否出现过(字符串)

                            x=false;//标记。

                    }

                    if(!x)break;//都存在就输出字符长度!为(b).

                    maxn=b;//表示字节长度!****(切记此处)****

                }

            }

            printf("%d\n",maxn);

        }

    return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: