vijos-1382 寻找主人

题意:

给出两个相同长度的数字串;

求两个串是否本质相同,相同则输出最小表示;

长度L似乎给的不对,大概是2000000左右吧;

题解:

最小表示法裸题,证明正确性啥的详见论文吧;

这东西大体的思路就是两个指针扫;

相同则累加k,不同就向后跳k+1个;

因为前面那段相同所以就可以由另一个指针去扫,来节约时间;

O(n)这个很显然咯,就一个for循环(笑);

并且每个数都在+++不像kmp还会由next数组回退;

模板别敲错,更别忘了。。

代码:

#include<stdio.h>
#include<string.h>
#include<algorithm>
#define N 2100000
using namespace std;
char a[N<<1],b[N<<1];
int len;
int slove(char *s)
{
	int i,j,k,cmp;
	for(i=1,j=2,k=0;i<=len&&j<=len&&k<=len;)
	{
		cmp=s[i+k]-s[j+k];
		if(!cmp)	k++;
		else
		{
			if(cmp>0)	i+=k+1;
			else		j+=k+1;
			if(i==j)	j++;
			k=0;
		}
	}
	return min(i,j);
}
int main()
{
	int i,j,k,s1,s2;
	scanf("%s%s",a+1,b+1);
	len=strlen(a+1);
	memcpy(a+len+1,a+1,sizeof(int)*len);
	memcpy(b+len+1,b+1,sizeof(int)*len);
	s1=slove(a);
	s2=slove(b);
	for(i=s1,j=s2,k=1;i<s1+len;i++,j++)
		if(a[i]!=b[j])
			k=0;
	if(!k)	puts("No");
	else
	{
		puts("Yes");
		a[s1+len]='\0';
		puts(a+s1);
	}
	return 0;
}
时间: 2024-11-08 01:06:25

vijos-1382 寻找主人的相关文章

【BZOJ 1398】 1398: Vijos1382寻找主人 Necklace (最小表示法)

1398: Vijos1382寻找主人 Necklace Time Limit: 5 Sec  Memory Limit: 128 MBSubmit: 308  Solved: 129 Description 给定两个项链的表示,判断他们是否可能是一条项链. Input 输入文件只有两行,每行一个由0至9组成的字符串,描述一个项链的表示(保证项链的长度是相等的). Output 如果两条项链不可能同构,那么输出'No',否则的话,第一行输出一个'Yes' 第二行输出该项链的字典序最小的表示. 设

C++异常处理 - try,catch,throw,finally的用法

写在前面 所谓异常处理,即让一个程序运行时遇到自己无法处理的错误时抛出一个异常,希望调用者可以发现处理问题. 异常处理的基本思想是简化程序的错误代码,为程序键壮性提供一个标准检测机制. 也许我们已经使用过异常,但是你习惯使用异常了吗? 现在很多软件都是n*365*24小时运行,软件的健壮性至关重要. 内容导读 本文包括2个大的异常实现概念:C++的标准异常和SHE异常. C++标准异常: 也许你很高兴看到错误之后的Heap/Stack中对象被释放,可是如果没有呢? 又或者试想一下一个能解决的错误

C++处理异常 try,catch,throw,finally

异常处理的基本思想是简化程序的错误代码,为程序键壮性提供一个标准检测机制. 也许我们已经使用过异常,但是你会是一种习惯吗,不要老是想着当我打开一个文件的时候才用异常判断一下,我知道对你来说你喜欢用return value或者是print error message来做,你想过这样做会导致Memory Leak,系统退出,代码重复/难读,垃圾一堆…..吗?现在的软件已经是n*365*24小时的运行了,软件的健壮已经是一个很要考虑的时候了.自序:对写程序来说异常真的是很重要,一个稳健的代码不是靠返回

More Effective C++

条款一:指针与引用的区别 指针与引用看上去完全不同(指针用操作符'*'和'->',引用使用操作符'.'),但是它们似乎有相同的功能.指针与引用都是让你间接引用其他对象.你如何决定在什么时候使用指针,在什么时候使用引用呢? 首先,要认识到在任何情况下都不能用指向空值的引用.一个引用必须总是指向某些对象.因此如果你使用一个变量并让它指向一个对象,但是该变量在某些时候也可能不指向任何对象,这时你应该把变量声明为指针,因为这样你可以赋空值给该变量.相反,如果变量肯定指向一个对象,例如你的设计不允许变量为

More Effective C++----异常 &amp; (9)使用析构函数防止资源泄漏

异常 关于C++异常的详细知识,请参考<http://blog.csdn.net/qianqin_2014/article/details/51325842> C++新增的异常(exception)机制改变了某些事情,这种改变是深刻的,彻底的,可能是令人不舒服的.例如:使用未经处理的或原始的指针变得很危险:资源泄漏的可能性增加了:写出具有你希望的行为的构造函数与析构函数变得更加困难.特别小心防止程序执行时突然崩溃.执行程序和库程序尺寸增加了,同时运行速度降低了. 这就使我们所知道的事情.很多使

字符串最小表示初探 By cellur925

我们考虑有一个字符串,可以从这个字符串的不同位置出发,把这个字符串大声朗读出来,当到字符串末端的时候再从头开始读,直到回到"梦开始的地方". 设字符串长度为\(n\),那么有\(n\)种不同的读法.我们现在想要在这些读法中找一个字符串使得他字典序最小,如何快速求出? 我们当然可以用其他朴素的方法(这里不再赘述),但其实我们有更高效的线性算法:最小表示法. 算法描述 首先把这个字符串复制二倍接在后面(类似断环为链) 然后利用两个指针\(i=1\)和\(j=2\)在\(k=0\)的帮助下向

spring-data-jpa实体类继承抽象类如何映射父类的属性到数据库

在抽象父类上加上注解@MappedSuperclass @MappedSuperclass public class Pet { private Integer id;//id private String name;//名字 private String variety;//品种 private double weight;//体重 private Integer age;//年龄 private char vaccine;//是否注射疫苗 y:已注射 n:未注射 d:未知 private I

vijos P1352 最大获利(最小割)

请不要随便指点别人该怎么做.每一个人的人生都应该自己掌握.你给不了别人一切.你也不懂别人的忧伤. 微笑不代表快乐.哭泣不一定悲伤 不努力怎么让关心你的人幸福.不努力怎么让看不起你的人绝望. 我用生命在奋斗--lx_Zz ------------------------------------------------------------- -------------------------    华丽的切割线    ---------------------------- ----------

vijos p1071新年趣事之打牌

描述 过年的时候,大人们最喜欢的活动,就是打牌了.xiaomengxian不会打牌,只好坐在一边看着. 这天,正当一群人打牌打得起劲的时候,突然有人喊道:“这副牌少了几张!”众人一数,果然是少了.于是这副牌的主人得意地说:“这是一幅特制的牌,我知道整副牌每一张的重量.只要我们称一下剩下的牌的总重量,就能知道少了哪些牌了.”大家都觉得这个办法不错,于是称出剩下的牌的总重量,开始计算少了哪些牌.由于数据量比较大,过了不久,大家都算得头晕了. 这时,xiaomengxian大声说:“你们看我的吧!”于