poj 3080

题意:给你n个长度都为60的串,求出它们的最长公共子串,如果这个子串的长度 < 3则输出“no significant commonalities”,如果存在多个最长公共子串,则输出字典序最小的那一个。

思路:枚举+KMP。枚举第一个串的所有后缀串(而不是枚举第一个串的所有子串),每一个后缀串做一次KMP,求出这些串的与其余所有串的最长匹配。

#include<iostream>
#include<cstring>
using namespace std;
const int Max = 62;
 
char text[10][Max], pat[Max];
int n, ma, lenp, next[Max];
 
void get_next()
{
    int j=1,k=0;
    next[0]=-1;
	next[1]=0;
    while(j< lenp)
	{
        if(pat[j] == pat[k])
		{
			next[j+1]=k+1;
			j++;
			k++;
        }
		if (k==0)
		{
			next[j+1]=0;
			j++;
		}
        else k= next[k];
    }
}

void KMP()
{
    int k, m, i, j;
    get_next();
    ma = 100;
    for(k = 1; k < n; k ++)
	{
        i = 0; j = 0; m = 0;
        while(i < 60 && j < lenp)
		{
            if(j == -1 || text[k][i] == pat[j])
			{
                i ++; 
				j ++;
            }
            else j = next[j];
            if(j > m) 
				m = j;
        }
        if(m < ma) 
			ma = m;
    }
}

int main()
{
    int t, i;
    char result[Max];
    scanf("%d", &t);
    while(t--)
	{
        scanf("%d", &n);
        for(i = 0; i < n; i ++)
            scanf("%s", text[i]);
        int ans = 0;
        for(i = 0; i <= 57; i ++)
		{
            strcpy(pat, text[0] + i);    //  枚举第一个串的所有后缀串(当然最后2个可以省去)。
            lenp = 60 - i;
            KMP();                       //  KMP求出这个后缀串与其余所有串的最大匹配。
            if(ans < ma)
			{
                ans = ma;
                strncpy(result, text[0] + i, ans);
                result[ans] = '\0';
            }
            else if(ans == ma)
			{         //  存在多个最长公共子串,输出字典序最小的,WA了一次。
                char tmp[Max];
                strncpy(tmp, text[0] + i, ans);    //  复习: strncpy()没有复制最后的'\0'。
                tmp[ans] = '\0';
                if(strcmp(tmp, result) < 0)//字典序输出
                    strcpy(result, tmp);
            }
        }
        if(ans >= 3)
            printf("%s\n", result);  
        else
            printf("no significant commonalities\n");  
    }
    return 0;
}

 

weixin073智慧旅游平台开发微信小程序+ssm后端毕业源码案例设计 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
python017基于Python贫困生资助管理系统带vue前后端分离毕业源码案例设计 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值