bzoj 1398 项链 【最小表示法】

原创 2015年11月20日 23:10:45

盗CA爷的题,学习了最小表示法,最后发现CA爷不是写的这个算法。

但不管了。

最小表示法大致是维护两个指针ij且i!=j 把它们向后扫,直到st[i+k]!=st[j+k] 然后将st较大的那个指针移到x+k+1,如果两个指针相等,任取一个加一。 注意是一个循环字符串,在k=l时退出。

因为vijos上没有JUDGE_ONLINE 这个宏,wa了半天。

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>

#define ll long long
#define inf 1e9
#define eps 1e-10
#define md
#define N 2000010
using namespace std;
char st1[N],st2[N];
int get(char st[],int l)
{
	int i=0,j=1;
	while (i<l&&j<l)
	{
		int k=0;
		while (k<l&&st[i+k]==st[j+k]) k++;
		if (k==l) break;
		if (st[i+k]>st[j+k]) i=i+k+1;
		  else j=j+k+1;
		if (i==j) j++;
	//	printf("%d %d\n",i,j);
	} //printf("\n");
	return min(i,j);
}
		

int main()
{
#ifndef ONLINE_JUDGE
	freopen("data.in","r",stdin); freopen("data.out","w",stdout);
#endif
	scanf("%s%s",st1,st2);
	int l1=strlen(st1),l2=strlen(st2);
	for (int i=l1;i<(l1<<1);i++) st1[i]=st1[i-l1]; st1[l1<<1]='\0';
	for (int j=l2;j<(l2<<1);j++) st2[j]=st2[j-l2]; st2[l2<<1]='\0';
	//printf("%s %s\n",st1,st2);
	if (l1!=l2)
	{
		printf("No\n");
	}
	else
	{
		int a=get(st1,l1),b=get(st2,l2);
		//printf("%d %d\n",a,b);
		bool ok=1;
		for (int i=a,j=b,l=1;l<=l1;l++,i++,j++)
		{
			if (st1[i]!=st2[j]) { ok=0; break;}
		}
		if (ok)
		{
			printf("Yes\n");
			for (int i=a,l=1;l<=l1;l++,i++)
			{
				putchar(st1[i]);
			}
			printf("\n");
		}
		else printf("No\n");
	}
	return 0;
}


【bzoj1398】【寻找主人】【最小表示法】

Description  给定两个项链的表示,判断他们是否可能是一条项链。 Input 输入文件只有两行,每行一个由0至9组成的字符串,描述一个项链的表示(保证项链的长度是相等的)。 ...

BZOJ 1398: Vijos1382寻找主人 Necklace【字符串最小表示

第一次写最小表示法,纪念一下233333【虽然clj聚聚说用SAM做也不错虽然大概可能常数大了一点 反正直接求两个字符串的最小表示再check一下就好了 #include #define MAXN 1...
  • Flaze_
  • Flaze_
  • 2016年09月09日 11:04
  • 240

[BZOJ1398] Vijos1382寻找主人 Necklace

传送门http://www.lydsy.com/JudgeOnline/problem.php?id=1398题目大意求最小表示法题解const maxn=1000010; var x...

bzoj1398 寻找主人

Description  给定两个项链的表示,判断他们是否可能是一条项链。 Input 输入文件只有两行,每行一个由0至9组成的字符串,描述一个项链的表示(保证项链的长度是相等的)。 ...

bzoj1398: Vijos1382寻找主人 Necklace

对于每一个项链,我们可以发现他的所有表示实际上可以转化为一个环状顺时针的字符串。 对于给出的两个A,B串如果想要知道是否匹配,那只需要把其中某一个串(这里为了方便叙述我们选择B串)延伸一倍(环形通用...
  • Lin1043
  • Lin1043
  • 2017年08月30日 22:18
  • 71

【bzoj1398】Vijos1382寻找主人 Necklace 最小表示法

这道题只需要把原串复制一遍,然后拿另一个串去匹配就可以了。 但是作死学了下最小表示法。 http://wenku.baidu.com/link?url=disErIxplfqlFvdZy2Zy3q7F...

字符串最小表示法 O(n)算法

求字符串的循环最小表示:   上面说的两个字符串同构的,并没有直接先求出Min(s),而是通过指针移动,当某次匹配串长时,那个位置就是Min(s)。而这里的问题就是:不是给定两个串,而是给出一个串...

【理解字符串循环同构的最小表示法】

循环字符串的最小表示法的问题可以这样描述:对于一个字符串S,求S的循环的同构字符串S’中字典序最小的一个。由于语言能力有限,还是用实际例子来解释比较容易:设S=bcad,且S’是S的循环同构的串。S’...
  • cclsoft
  • cclsoft
  • 2010年04月09日 16:35
  • 11176

字符串的最小表示法

字符串最小表示法:以某个小标开始字典序最小的串。 假设有两个下标i,j,表示如果从i和从j出发的字符串,有一个k表示字符串的长度,如果长度达到len,就表示找到最小的串。 #include #incl...

最小表示法详解

有一个字符串,这个字符串的首尾是连在一起的,要求寻找一个位置,以该位置为起点的字符串的字典序在所有的字符串中中最小。 【暴力算法】: O(n)的时间枚举起始位置,O(n)的时间比对字符串的...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:bzoj 1398 项链 【最小表示法】
举报原因:
原因补充:

(最多只允许输入30个字)