`

poj 3080

    博客分类:
  • KMP
 
阅读更多

题意:给你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;
}

 

分享到:
评论

相关推荐

    POJ3080-Blue Jeans

    【标题】"POJ3080-Blue Jeans" 是北京大学在线编程平台POJ(Problem Online Judge)上的一道算法竞赛题目。这道题目主要考察的是动态规划和数组处理的能力,是许多编程爱好者和竞赛选手在提升算法技能时会遇到的经典...

    POJ3080-Blue Jeans 测试数据

    北大ACM-POJ3080 - Blue Jeans 原比赛题目的测试数据

    POJ算法题目分类

    * 串:串是指解决问题的基本数据结构,如 poj1035、poj3080、poj1936。 * 排序:排序是指解决问题的排序算法,如快排、归并排、堆排。 * 简单并查集:简单并查集是指解决问题的简单并查集算法。 * 哈希表和二分查找...

    poj题目分类

    * 串:例如 poj1035、poj3080、poj1936。 * 排序:例如 poj2388、poj2299。 * 简单并查集的应用。 * 哈希表和二分查找等高效查找法:例如 poj3349、poj3274、poj2151、poj1840、poj2002、poj2503。 * 哈夫曼树...

    poj训练计划.doc

    - 字符串处理:如KMP算法和后缀数组,用于字符串搜索和模式匹配,如`poj1035, poj3080`。 - 排序算法:如快速排序和归并排序,用于对数据进行排序,如`poj2388, poj2299`。 - 并查集:用于处理集合的合并和查询...

    ACM-POJ 算法训练指南

    1. **树和二叉树**:树和二叉树的基本操作和应用(poj1035, poj3080, poj1936)。 2. **堆**:堆排序及其在优先队列中的应用(poj2388, poj2299)。 3. **哈希表**:用于快速查找和存储,如Hash函数的设计(poj3349,...

    POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类

    - **例题**:poj1035, poj3080, poj1936 - **解释**:树形数据结构的题目通常涉及树的遍历、查找等问题。 #### 2. 字符串 - **例题**:poj2388, poj2299 - **解释**:字符串问题通常涉及字符串的模式匹配、编辑距离...

    acm训练计划(poj的题)

    - (poj1035, poj3080, poj1936):基本的数据结构及其应用场景。 2. **树**: - (poj2388, poj2299):介绍二叉树、平衡二叉树等。 3. **字符串处理**: - (poj3349, poj3274, POJ2151, poj1840, poj2002, poj...

    acm poj300题分层训练

    poj1035、poj3080等训练了串的操作,poj2388、poj2299等则涉及排序问题,poj2524、poj1611等是并查集的实例,poj3349、poj3274等展示了哈希表和二分查找,poj3253是哈夫曼树的题目,poj2442和poj1442则关于堆。...

    acm新手刷题攻略之poj

    - 推荐题目:[poj1035](https://vjudge.net/problem/POJ-1035)、[poj3080](https://vjudge.net/problem/POJ-3080)、[poj1936](https://vjudge.net/problem/POJ-1936) - 堆结构通常用于实现优先队列等数据结构。 2...

    POJ 分类题目

    - poj3080 - poj1936 - **应用场景**:适用于文本处理、模式匹配等问题。 **2. 排序** - **定义**:包括快速排序、归并排序、堆排序等。 - **示例题目**: - poj2388 - poj2299 - **应用场景**:适用于数据组织...

    POJ题目分类

    - **示例题目**: poj1035, poj3080, poj1936 #### 2. 栈 - **内容**: 包括栈的基本操作如入栈、出栈等。 - **示例题目**: poj2388, poj2299 #### 3. 字典树 - **内容**: 字典树是一种高效的数据结构,主要用于...

    ACMer需要掌握的算法讲解 (2).docx

    * 串算法:POJ1035、POJ3080、POJ1936 * 哈希表和二分查找等高效查找法:POJ3349、POJ3274、POJ2151、POJ1840、POJ2002、POJ2503 * 哈夫曼树:POJ3253 * 背包问题:POJ1837、POJ1276 * DP算法:POJ3267、POJ1836、...

    ACM常用算法及其相应的练习题.docx

    * 串:poj1035, poj3080, poj1936 * 排序:快排、归并排、堆排 + poj2388, poj2299 * 简单并查集的应用 * 哈希表和二分查找等高效查找法 + poj3349, poj3274, poj2151, poj1840, poj2002, poj2503 * 哈夫曼树:poj...

    ACM 详解算法目录

    例如,POJ1035和POJ3080是串的经典例题,而POJ2388和POJ2299则是排序算法的代表题。 在简单搜索部分,涵盖了深度优先搜索和广度优先搜索两种搜索算法。例如,POJ2488和POJ3083是深度优先搜索的经典例题,而POJ3278...

    ACMer需要掌握的算法讲解.docx

    8. 串(poj1035, poj3080, poj1936) 9. 哈希表和二分查找等高效查找法(poj3349, poj3274, POJ2151, poj1840, poj2002, poj2503) 10. 哈夫曼树(poj3253) 二、图算法 1. 度限制最小生成树和第 K 最短路(poj...

    ACM常用算法及其相应的练习题 (2).docx

    (1) 串:poj1035, poj3080, poj1936 (2) 排序:快排、归并排、堆排 (3) 简单并查集的应用: (4) 哈希表和二分查找等高效查找法:poj3349, poj3274, POJ2151, poj1840, poj2002, poj2503 (5) 哈夫曼树:poj3253 (6) ...

    ACM算法总结大全——超有用!

    1. 串:处理字符串相关问题,如poj1035、poj3080和poj1936。 2. 排序:快速排序、归并排序(涉及逆序数)和堆排序,如poj2388、poj2299。 3. 并查集:处理集合合并与查询,如poj3349。 4. 哈希表和二分查找:快速...

    很快速的提高算法能力.pdf

    例如,poj1035、poj3080 和 poj1936 都涉及串的操作。排序算法如快排、归并排和堆排,例如 poj2388 和 poj2299。哈希表和二分查找在 poj3349 等题目中体现其效率。trie 树在 poj2513 中有应用。 搜索策略包括深度...

Global site tag (gtag.js) - Google Analytics