Uva 12012 Detection of Extraterrestrial 求循环节个数为1-n的最长子串长度 KMP

题目链接:点击打开链接

题意:

给定一个字符串str 求字符串str的

循环节个数为 1-len 个的

最长子串长度

思路:套用kmp的性质

#include<string.h>
#include<stdio.h>
#include <iostream>
using namespace std;
#define n 1300
void getnext(char str[n],int next[n]){
	int m=strlen(str);
	next[0]=next[1]=0;
	for(int i=1;i<m;i++){
		int j=next[i];
		while(j&&str[i]!=str[j])j=next[j];
		next[i+1]= str[i]==str[j] ? j+1 : 0;
	}
}
int Inext[n],f[n];
char Istr[n],c[n];

int main()
{
	int i,k,j,t,l=1,g;	scanf("%d",&t);
	while(t--)
	{
		memset(f,0,sizeof(f));
		scanf("%s",Istr);
		int len=strlen(Istr);
		for(i=0;i<len;i++)
		{
			k=0;
			for(j=i;j<len;j++)c[k++]=Istr[j];	c[k]=0;
			getnext(c,Inext);
			for(j=1;j<=k;j++) //扫一遍失配数组
				if(j%(j-Inext[j])==0)
				{
					for(g=1;g<=j/(j-Inext[j]);g++)
						if((j/(j-Inext[j]))%g==0)
							f[g]=max(f[g],j);
				}
		}
		f[1]=len;
		printf("Case #%d:",l++);
		for(i=1;i<=len;i++)
			printf(" %d",f[i]);
		puts("");
	}
	return 0;
}

Uva 12012 Detection of Extraterrestrial 求循环节个数为1-n的最长子串长度 KMP

时间: 2024-10-18 00:08:58

Uva 12012 Detection of Extraterrestrial 求循环节个数为1-n的最长子串长度 KMP的相关文章

UVA 12012 - Detection of Extraterrestrial(KMP)

UVA 12012 - Detection of Extraterrestrial 题目链接 题意:给定一个字符串,求其所有子串中,对应1-n循环次数的最长串长度 思路:KMP,n才1000,可以接受O(n^2)的算法,对于每个后缀串,做一次KMP,然后在遍历一遍KMP数组,这样就可以得到每个子串的所有循环次数了,然后不断更新答案即可 代码: #include <cstdio> #include <cstring> #include <algorithm> using

数据结构——算法之(032)(求两个串中的第一个最长子串)

[申明:本文仅限于自我归纳总结和相互交流,有纰漏还望各位指出. 联系邮箱:[email protected]] 题目: 求两个串中的第一个最长子串(神州数码曾经试题).如"abractyeyt","dgdsaeactyey"的最大子串为"actyey". 题目分析: 1.这里仅仅是实现了简单的字符串算法(最大支持字符串长度64),主要是展示算法思想 2.思路是把2个字符串每一个字符的匹配关系,映射到一张二维数组表中,匹配写1,非匹配写0 算法实现

POJ 3294 后缀数组:求不小于k个字符串中的最长子串

思路:先把所有的串连接成一个串,串写串之前用没出现过的字符隔开,然后求后缀:对height数组分组二分求得最长的公共前缀,公共前缀所在的串一定要是不同的,不然就不是所有串的公共前缀了,然后记下下标和长度即可. 刚开始理解错题意,然后不知道怎么写,然后看别人题解也不知道怎么意思,后面看了好久才知道题目意思理解错了. 时间四千多ms,别人才一百多ms,不知道别人怎么做的-- #include<iostream> #include<cstdio> #include<cstring&

hud5451_求循环节加矩阵快速幂

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5451 题目描述: 对于,给出x和mod,求y向下取整后取余mod的值为多少? 找循环节解析链接:http://blog.csdn.net/ACdreamers/article/details/25616461 裸题链接:http://blog.csdn.net/chenzhenyu123456/article/details/48529039 1 #include <algorithm> 2 #i

(KMP 1.4)hdu 3746 Cyclic Nacklace(使用next数组来求循环节的长度——求一个字符串需要添加多少个字符才能使该字符串的循环节的个数&gt;=2)

题目: Cyclic Nacklace Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 3387    Accepted Submission(s): 1549 Problem Description CC always becomes very depressed at the end of this month, he has che

Poj1961--Period(Kmp, Next数组求循环节长度 &amp;&amp; 出现次数)

Period Time Limit: 3000MS   Memory Limit: 30000K Total Submissions: 14657   Accepted: 6967 Description For each prefix of a given string S with N characters (each character has an ASCII code between 97 and 126, inclusive), we want to know whether the

UVA 11582 Colossal Fibonacci Numbers!(循环节打表+幂取模)

题目链接:https://cn.vjudge.net/problem/UVA-11582 1 /* 2 问题 3 输入a,b,n(0<a,b<2^64(a and bwill not both be zero) and 1<n<1000) 4 计算并输出f(a^b)%n的结果 5 其中f(i)是斐波那契数列 6 7 解题思路 8 所有的结果都是f(i)对n取模,不妨设F(i)=f(i)%n.不难发现当F(i),F(i+1)出现重复的时候,整个序列就开始出现重复. 9 10 所以设周

(求循环节的个数)Power Strings -- poj -- 2406

链接: http://poj.org/problem?id=2406 Power Strings Time Limit:3000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Submit Status Description Given two strings a and b we define a*b to be their concatenation. For example, if a = "abc&qu

UVA - 315 Network(tarjan求割点的个数)

题目链接:https://vjudge.net/contest/67418#problem/B 题意:给一个无向连通图,求出割点的数量.首先输入一个N(多实例,0结束),下面有不超过N行的数,每行的第一个数字代表后面的都和它存在边,0表示行输入的结束. 题解:简单的求割点模版,所谓割点就是去掉这一个点还有于这个点链接的边之后使得原来的图连通块增加. 由于这是模版题代码会加上注释. #include <iostream> #include <cstring> using namesp