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

1398: Vijos1382寻找主人 Necklace

Time Limit: 5 Sec  Memory Limit: 128 MB
Submit: 308  Solved: 129

Description

给定两个项链的表示,判断他们是否可能是一条项链。

Input

输入文件只有两行,每行一个由0至9组成的字符串,描述一个项链的表示(保证项链的长度是相等的)。

Output

如果两条项链不可能同构,那么输出’No’,否则的话,第一行输出一个’Yes’

第二行输出该项链的字典序最小的表示。 设L = 项链长度,L <= 1000000。

Sample Input

2234342423

2423223434

Sample Output

Yes

2234342423

HINT

Source

【分析】

  最小表示法。。有点忘了。。

 1 #include<cstdio>
 2 #include<cstdlib>
 3 #include<cstring>
 4 #include<iostream>
 5 #include<algorithm>
 6 using namespace std;
 7 #define Maxn 1000010
 8
 9 char s1[2*Maxn],s2[2*Maxn];
10 int l;
11
12 int mymin(int x,int y) {return x<y?x:y;}
13
14 int ffind(char *s)
15 {
16     int i=0,j=1,k=0;
17     while(i+k<=l&&j+k<=l)
18     {
19         if(s[i+k]==s[j+k]) k++;
20         else if(s[i+k]<s[j+k]) j+=k+1,k=0;
21         else i+=k+1,k=0;
22         if(i==j) j++;
23     }
24     return mymin(i,j);
25 }
26
27 int main()
28 {
29     scanf("%s%s",s1,s2);
30     l=strlen(s1);
31     for(int i=0;i<l;i++) s1[i+l]=s1[i];
32     for(int i=0;i<l;i++) s2[i+l]=s2[i];
33     int a=ffind(s1),b=ffind(s2);
34     bool ok=1;
35     for(int i=0;i<l;i++) if(s1[a+i]!=s2[b+i]) {ok=0;break;}
36     if(!ok) printf("No\n");
37     else
38     {
39         printf("Yes\n");
40         for(int i=0;i<l;i++) printf("%c",s1[a+i]);
41         printf("\n");
42     }
43     return 0;
44 }

2017-04-17 08:14:10

时间: 2024-10-17 20:55:14

【BZOJ 1398】 1398: Vijos1382寻找主人 Necklace (最小表示法)的相关文章

vijos-1382 寻找主人

题意: 给出两个相同长度的数字串: 求两个串是否本质相同,相同则输出最小表示: 长度L似乎给的不对,大概是2000000左右吧: 题解: 最小表示法裸题,证明正确性啥的详见论文吧: 这东西大体的思路就是两个指针扫: 相同则累加k,不同就向后跳k+1个: 因为前面那段相同所以就可以由另一个指针去扫,来节约时间: O(n)这个很显然咯,就一个for循环(笑): 并且每个数都在+++不像kmp还会由next数组回退: 模板别敲错,更别忘了.. 代码: #include<stdio.h> #inclu

BZOJ 2176 Strange string 最小表示法

题目大意:给定一个串S,求最小表示法 n<=1000W,实在不敢写后缀自己主动机,就去学了最小表示法= = 记得用unsigned char不然WA= = 数据真是逗- - #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #define M 10001000 using namespace std; int n; unsigned char s[

BZOJ 2176 Strange String (最小表示法)

题目大意: 与别的裸题的唯一不同点是其符号的ASCII码值在3 ~ 254 之间. 算法讨论: 最小表示法直接上.但是唯一不同的就是注意这里的字符范围,用char是会get wa的,所以要用unsigned char.这两者的区别就是可以表示的ASCII范围不同. char是有符号位的,其可以表示的范围是-128~127, 而unsigned char 可以表示的范围是 0~ 255. 至于输入输出,和原来是一样的.只改一个关键字即可. 不贴代码了.

hdu 2609 How many 最小表示法

How many Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 1248    Accepted Submission(s): 486 Problem Description Give you n ( n < 10000) necklaces ,the length of necklace will not large than 100

HDU 2609 How many (最大最小表示法)

How many Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 2184    Accepted Submission(s): 904 Problem Description Give you n ( n < 10000) necklaces ,the length of necklace will not large than 100

HDU 4162 Shape Number (最小表示法)

题意:给你一串n个数,求出循环来看一阶差的最小字典序:数字串看成一个顺时针的环,从某一点开始顺时针循环整个环,保证字典序最小就是答案 例如给你 2 1 3 就会得到(1-2+8 注意题意负数需要加8) (3-1) (2-3+8)-> 7 2 7 答案就是2 7 7. 典型的最小表示法.线性时间内求出最小字典序. 首先复制一遍数字串在原串后面,这样从原串任意位置开始向再后n个位置就是答案.接着双指针维护,直接双指针暴力比较数字串,当出现不同数字时,就把字典序大的那个指针向后移动尽量多的位置这样可以

hdu2609 最小表示法

Give you n ( n < 10000) necklaces ,the length of necklace will not large than 100,tell me How many kinds of necklaces total have.(if two necklaces can equal by rotating ,we say the two necklaces are some). For example 0110 express a necklace, you can

【算法】字符串的最小表示法

字符串的最小表示法,就是对于一个字符串,可以将它的最后一位放到第一位来,依次类推,一共有n种变形,n为字符串长度 例如: s="00ab" 变形有(省略引号)b00a ab00 0ab0 一共4种 那么找到其中字典序最小的一个,用的算法便是这个. 定义三个指针,i,j,k 初始i=0;j=1;k=0 首先,如果s[i]<s[j]那么很明显j++ 如果s[i]>s[j]那么也很明显i=j++ 省下的就是如果s[i]==s[j]的时候. 这时候有一个性质就是在i和j之间的所有的

[最小表示法] hdu 2609 How many

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=2609 How many Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 1225    Accepted Submission(s): 476 Problem Description Give you n ( n < 10000) nec