`
人生难得糊涂
  • 浏览: 117412 次
社区版块
存档分类
最新评论

poj3080-kmp+枚举子串 求最长公共子串

    博客分类:
  • KMP
 
阅读更多

因为一直有事这道题又有点繁琐, 所以写了好多天今天才AC,不过1A还是很爽的。

思路还是很简单的,对第一个主串枚举其所有子串,然后将每个子串都与其他的所以主串KMP匹配,如果是所有主串的公共子串则记录 并选出最大的一个  注意这道题要字典序最小

 

代码:

#include "iostream"
using namespace std;
#define  maxsize   80
char c[11][maxsize];
char substring[maxsize];
int next[11][maxsize];
char cans[maxsize];

void getnext(int  n,int length)
{
	
	int  i=0,j=-1;
	next[n][0]=-1;
	while(i<length)
	{
		if (j==-1||c[n][i]==c[n][j])
		{
			i++;
			j++;
			next[n][i]=j;
		}
		else
		{
			j=next[n][j];
		}
	}
}

int	KMP(int  n,int length)
{

	int i=0,j=0;
	int length1=strlen(substring);
	while (i<length&&j<length1)
	{
		if (j==-1||c[n][i]==substring[j])
		{
			i++;
			j++;
		}
		else
		{
			
			j=next[n][j];
		}
	}
	
	if (j>=length1)
	{
		return i-length1 ;
	}
	else
		return -3;
	
	
}
int main()
{
	int case1;
	scanf("%d",&case1);
	while (case1--)
	{
		int  num;
		scanf("%d",&num);
		int i,j;
		for(i=0;i<num;i++)
		{
			scanf("%s",c[i]);	
			int length=strlen(c[i]);
			getnext(i,length);//计算每个字符串的next
		}
		int length1=strlen(c[0]);
		int tans=0;
	
		//枚举从c[0]所有子串
		for (i=2;i<length1;i++)//i表示子串长度
		{
			for (j=0;j<length1;j++)//j   表示子串第一个元素位置
			{
				substring[0]='\0';
				strncpy(substring,c[0]+j,i+1);//得到一个子串
				int flag=1;
				int slen=strlen(substring);
				//判断子串在不在目标串中
				for (int k=1;k<num;k++)
				{
					int temp=KMP(k,strlen(c[k]));
					
					
					if (temp==-3)//说明这个子串不存在于c[k]
					{
						flag=0;
						break;
					}
				}
				if (flag==1)
				{
					if (tans==slen)
					{
						if (strcmp(cans,substring)>0)
						{
						tans=slen;

						strcpy(cans,substring);	
						}
					}
					if (tans<slen)
					{
						tans=slen;
						strcpy(cans,substring);	
					}
					
				}
			}
		}
		
		if (tans<3)
		{
			cout<<"no significant commonalities"<<endl;
		}
		else
			cout<<cans<<endl;
		
	}
	
}

 

1
0
分享到:
评论

相关推荐

    POJ3080-Blue Jeans

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

    POJ3080-Blue Jeans 测试数据

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

    POJ2002-Squares

    【标题】"POJ2002-Squares"是一个经典的计算机编程题目,源自北京大学的在线判题系统(POJ,即PKU Online Judge)。这个题目主要涉及到算法设计和实现,尤其是数学和动态规划方面的知识。 【描述】"解题报告+AC代码...

    POJ3253-POJ3253-Fence Repair【STL优先队列】

    标题“POJ3253-POJ3253-Fence Repair【STL优先队列】”指的是一个在线编程竞赛题目,源自北京大学的在线判题系统POJ(Problem Online Judge)。该题目要求参赛者使用C++编程语言解决特定的问题,并且在解决方案中...

    POJ1426-Find The Multiple【BFS+同余模】

    【标题】"POJ1426-Find The Multiple【BFS+同余模】"是一道来源于北京大学在线编程平台POJ的算法题目,主要涉及到了广度优先搜索(BFS)与同余模运算的知识点。这道题目要求解决的是寻找一个整数的倍数问题,可能...

    POJ1002-487-3279【Hash+Qsort】

    标题中的"POJ1002-487-3279【Hash+Qsort】"是指一个编程挑战题目,通常在在线编程平台上出现,比如北京大学的Peking Online Judge (POJ)。这个题目结合了哈希表(Hash)和快速排序(Qsort)两种算法来解决问题。哈希...

    POJ1207-The 3n + 1 problem

    《POJ1207-The 3n + 1 problem》是北京大学在线编程平台POJ上的一道经典算法题目,其主要涉及的知识点是数论和动态规划。本题目的核心是解决著名的“Collatz Conjecture”问题,也被称为“3n+1猜想”。 3n+1猜想是...

    POJ3020-Antenna Placement

    【标题】"POJ3020-Antenna Placement"是一个经典的计算机编程竞赛题目,源自北京大学的在线评测系统POJ(PKU Online Judge)。这个题目挑战了参赛者在算法设计和实现上的能力。 【描述】"解题报告+AC代码"意味着这...

    poj 1000 - 2000 部分题目 官方分类

    3. **字符串处理**:这类题目主要涉及字符串操作,如模式匹配、编码解码、文本处理等,对字符串操作的理解和运用是编程中常见的技能。 4. **动态规划**:动态规划是一种解决复杂问题的有效方法,常常用于求解最优化...

    POJ3009-Curling 2.0【DFS+Vector+回溯+剪枝】

    《POJ3009-Curling 2.0:深度优先搜索、向量、回溯与剪枝的综合应用》 北京大学在线编程平台上的POJ3009题目名为"Curling 2.0",它是一道涉及到算法与数据结构的复杂问题,主要考察了参赛者对深度优先搜索(DFS)、...

    POJ3733-Changing Digits【DFS+强剪枝】

    【标题】"POJ3733-Changing Digits【DFS+强剪枝】"是一个来自北京大学在线评测系统POJ的编程题目,该题目主要涉及深度优先搜索(DFS)算法和强剪枝策略。在算法竞赛和编程挑战中,这类问题通常要求参赛者通过编写...

    POJ1836-Alignment

    在对齐问题中,可能需要找出两个字符串之间的最长公共子序列或最长公共子串,这是字符串处理中的经典问题。 4. **贪心算法**:另一种可能的解决方案是贪心策略,通过每次做出局部最优选择,期望得到全局最优解。...

    POJ2525-Text Formalization【TrieTree】

    《POJ2525-Text Formalization:深入解析TrieTree》 在计算机科学的世界里,算法和数据结构是解决问题的关键。今天我们要探讨的是一个名为"POJ2525-Text Formalization"的问题,它涉及到一种高效的数据结构——Trie...

    POJ1159-Palindrome

    【标题】"POJ1159-Palindrome" 是北京大学在线编程平台POJ上的一道编程题目。这道题目主要考察的是字符串处理和回文判断的知识点。 【描述】"北大POJ1159-Palindrome 解题报告+AC代码" 暗示了解决这道问题的方法和...

    POJ1837-Balance

    【标题】"POJ1837-Balance"是一个在线编程竞赛题目,源自著名的编程练习平台POJ(Programming Online Judge)。这个题目旨在测试参赛者的算法设计和实现能力,特别是处理平衡问题的技巧。 【描述】"解题报告+AC代码...

    POJ2503-Babelfish

    【标题】"POJ2503-Babelfish"是一个来自北京大学在线判题系统(POJ,Problem Online Judge)的编程题目。该题目要求参赛者编写程序解决特定的算法问题,通过编程语言实现,然后提交代码以供系统自动评测。 【描述】...

    POJ1010-STAMPS

    【标题】"POJ1010-STAMPS"是一个编程题目,来源于北京大学的在线判题系统POJ(Problem Set of Peking University),这是一处训练程序员算法技能和编程能力的平台。该题目旨在考察参赛者对动态规划或贪心算法的理解...

    魔兽世界终极版POJ的-测试数据

    这是魔兽世界终极版POJ的-测试数据,找了好久才找到的。 本来想设置为0积分,但是它居然自动收费(o_ _)ノ。 看传送门:https://pan.baidu.com/s/1cCIwW8psGDASu2JdZawG3Q

    POJ2299-Ultra-QuickSort

    【标题】"POJ2299-Ultra-QuickSort"是北京大学在线判题系统POJ上的一道编程题目,其主要涉及的算法是快速排序(Ultra-QuickSort)。快速排序是一种高效的排序算法,由C.A.R. Hoare在1960年提出。它的基本思想是采用...

    POJ1258-Agri-Net【Prim】

    【标题】"POJ1258-Agri-Net【Prim】" 是一个编程竞赛题目,来源于北京大学的在线评测系统POJ(Problem Online Judge)。这个题目主要涉及到图论中的一个重要算法——普里姆(Prim)算法。 【描述】"北大POJ1258-...

Global site tag (gtag.js) - Google Analytics