Redian新闻
>
申请绿卡需要提交报税相关的文件吗
avatar
申请绿卡需要提交报税相关的文件吗# EB23 - 劳工卡
e*i
1
昨天做了storm8 的online code,挂了。
题目变了,不再是以前说的find max sum path in one grid。
题目如下:
给定一个string,如 “codility”,每次向左循环一个char.
codility 0th;
odilityc 1st;
dilityco 2nd;
ilitycod 3rd;
....
codility 8th;
要求返回Unique 的string. 如上所示,应当返回 7.
然后又举例,“byebye”,应当返回二
任何string,包括空数组,应当最少返回1.
要求time complexity 和 space complexity 都为O(N).
我的code:
import java.util.HashMap;
public class Cyclic {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
String s = "";
System.out.println(cyclic_automorphisms(s));
}

public static int cyclic_automorphisms ( String S ) {
int lens = S.length();
HashMap map = new HashMap();
if(lens < 1)
return 0;
for(int i = 0; i < lens; i++){
if(!map.containsKey(S)){
map.put(S,i);
}
S = shiftLeft(S);
}
return map.size()-1;
}

public static String shiftLeft(String s){
return s.substring(1)+s.charAt(0);
}
}
在eclipse里测试,没有问题,也通过了测试,但他说我这个不是最优解。
我当时第一反应就是用Hashmap做,从前也没有想过哈希表的空间复杂度问题。我想是
不是跪在这个地方了,求大神指点。
另外,求大神Refer.
avatar
N*r
2
如题
avatar
e*i
3
上面的code是我在eclipse里面测试写的
avatar
t*e
4
好像要的,问一下律师
avatar
l*i
5
用Set?
avatar
e*i
6

不知道啊,以前做题都没有想过这个问题,而且不是说他们的问题对空间复杂度要求不
高么

【在 l****i 的大作中提到】
: 用Set?
avatar
j*y
7
为什么是返回7阿,这个unique的string没想明白

【在 e******i 的大作中提到】
: 昨天做了storm8 的online code,挂了。
: 题目变了,不再是以前说的find max sum path in one grid。
: 题目如下:
: 给定一个string,如 “codility”,每次向左循环一个char.
: codility 0th;
: odilityc 1st;
: dilityco 2nd;
: ilitycod 3rd;
: ....
: codility 8th;

avatar
p*2
8
然后又举例,“byebye”,应当返回二
这个为什么是2?
avatar
H*s
9
这个题目 先将string 复制级联然后每次shift一位判断是否相等
如 "codility" --> "codilitycodility" 然后再跟原string 判断就行了!

【在 e******i 的大作中提到】
: 昨天做了storm8 的online code,挂了。
: 题目变了,不再是以前说的find max sum path in one grid。
: 题目如下:
: 给定一个string,如 “codility”,每次向左循环一个char.
: codility 0th;
: odilityc 1st;
: dilityco 2nd;
: ilitycod 3rd;
: ....
: codility 8th;

avatar
M*5
10
好像原来的题目意思是这样子的,有一个string,如果string的length为len,那么可
以循环移位[0,len-1],如果循环移位后得到的string和原来的string一样,那么就
count++,因为循环移位为0的时候得到的string肯定是跟原来的string一样的,所以
count至少为1。。。反正我是这样理解的,不知道对不对?
avatar
p*2
11
是不是要用那个叫什么rolling hashing一类的东西来作了?
avatar
M*5
12
嗯,我觉得这个是最优解。。。

【在 H****s 的大作中提到】
: 这个题目 先将string 复制级联然后每次shift一位判断是否相等
: 如 "codility" --> "codilitycodility" 然后再跟原string 判断就行了!

avatar
H*s
13
对啊, 应该是3啊

【在 p*****2 的大作中提到】
: 然后又举例,“byebye”,应当返回二
: 这个为什么是2?

avatar
p*2
14

这个是O(n)的吗?

【在 M********5 的大作中提到】
: 嗯,我觉得这个是最优解。。。
avatar
M*5
15
byebye移0和3得到的string和原来的string一样,所以是2吧,是这样理解的吧?

【在 H****s 的大作中提到】
: 对啊, 应该是3啊
avatar
M*5
16
这个应该是空间时间都是O(n)的吧。。。我当时做的应该是空间是O(n^2)的,其实这题
就是这样一个trick

【在 p*****2 的大作中提到】
:
: 这个是O(n)的吗?

avatar
e*i
17

我觉得可能没有那么复杂

【在 p*****2 的大作中提到】
: 是不是要用那个叫什么rolling hashing一类的东西来作了?
avatar
e*i
18

因为从0开始排序啊,有3个,所以返回2

【在 p*****2 的大作中提到】
: 然后又举例,“byebye”,应当返回二
: 这个为什么是2?

avatar
p*2
19
n的大小是多少呢?
avatar
e*i
20

当时我也想到了这个算法,有点类似cracking 上的一道题,后来觉得hashmap简单就没
有细想了

【在 H****s 的大作中提到】
: 这个题目 先将string 复制级联然后每次shift一位判断是否相等
: 如 "codility" --> "codilitycodility" 然后再跟原string 判断就行了!

avatar
M*5
21
int CountString(std::string& str){
if( str.empty() )
return 0;
std::string shift_copy = str + str;
int count=0;
int len = str.length();
for(int i=0; iif( shift_copy.substr(i,len) == str )
count++;
}
return count;
}
avatar
p*2
22

没看明白。每次shift一位之后怎么比较呢?

【在 H****s 的大作中提到】
: 这个题目 先将string 复制级联然后每次shift一位判断是否相等
: 如 "codility" --> "codilitycodility" 然后再跟原string 判断就行了!

avatar
p*2
23

任何string,包括空数组,应当最少返回1.
这个怎么理解?

【在 e******i 的大作中提到】
:
: 当时我也想到了这个算法,有点类似cracking 上的一道题,后来觉得hashmap简单就没
: 有细想了

avatar
M*5
24
我跟你理解的好像不一样,我理解错了?

【在 e******i 的大作中提到】
:
: 当时我也想到了这个算法,有点类似cracking 上的一道题,后来觉得hashmap简单就没
: 有细想了

avatar
p*2
25

你这个不是O(n)的。

【在 M********5 的大作中提到】
: int CountString(std::string& str){
: if( str.empty() )
: return 0;
: std::string shift_copy = str + str;
: int count=0;
: int len = str.length();
: for(int i=0; i: if( shift_copy.substr(i,len) == str )
: count++;
: }

avatar
M*5
26
两倍的space还是算O(n)吧?

【在 p*****2 的大作中提到】
:
: 你这个不是O(n)的。

avatar
e*i
27


【在 p*****2 的大作中提到】
:
: 你这个不是O(n)的。

avatar
p*2
28

我是说时间。

【在 M********5 的大作中提到】
: 两倍的space还是算O(n)吧?
avatar
e*i
29

hashmap是o(n)么
你是说我写的么

【在 M********5 的大作中提到】
: 这个应该是空间时间都是O(n)的吧。。。我当时做的应该是空间是O(n^2)的,其实这题
: 就是这样一个trick

avatar
p*2
30

LZ说说N的范围是多少?

【在 e******i 的大作中提到】
:
: hashmap是o(n)么
: 你是说我写的么

avatar
M*5
31
如果这个string是aaaaa,那space是不是O(n^2)

【在 e******i 的大作中提到】
:
: hashmap是o(n)么
: 你是说我写的么

avatar
p*2
32
我目前的想法就是rolling hashing了。如果N不大好些,如果N很大,需要点数学知识
了。
avatar
w*x
33

同跪,今天给Zynga跪了, 最近跪的几家都是代码还来不及写就给据了,NND

【在 e******i 的大作中提到】
: 昨天做了storm8 的online code,挂了。
: 题目变了,不再是以前说的find max sum path in one grid。
: 题目如下:
: 给定一个string,如 “codility”,每次向左循环一个char.
: codility 0th;
: odilityc 1st;
: dilityco 2nd;
: ilitycod 3rd;
: ....
: codility 8th;

avatar
M*5
34
为什么这个时间不是O(n),不是总共循环n次吗?

【在 p*****2 的大作中提到】
: 我目前的想法就是rolling hashing了。如果N不大好些,如果N很大,需要点数学知识
: 了。

avatar
m*s
35
s匹配ss,KMP?

【在 e******i 的大作中提到】
: 昨天做了storm8 的online code,挂了。
: 题目变了,不再是以前说的find max sum path in one grid。
: 题目如下:
: 给定一个string,如 “codility”,每次向左循环一个char.
: codility 0th;
: odilityc 1st;
: dilityco 2nd;
: ilitycod 3rd;
: ....
: codility 8th;

avatar
e*i
36
貌似是100000吧,我记不清了,反正挺大的

【在 p*****2 的大作中提到】
: 我目前的想法就是rolling hashing了。如果N不大好些,如果N很大,需要点数学知识
: 了。

avatar
p*2
37

仔细看看。你这个是O(n^2)。这题哪里会那么简单呢。你仔细分析一下复杂度。

【在 M********5 的大作中提到】
: 为什么这个时间不是O(n),不是总共循环n次吗?
avatar
p*2
38

这个也可以。

【在 m******s 的大作中提到】
: s匹配ss,KMP?
avatar
p*2
39

ZKSS

【在 w****x 的大作中提到】
:
: 同跪,今天给Zynga跪了, 最近跪的几家都是代码还来不及写就给据了,NND

avatar
M*5
40
嗯,好像是这个数。。。

【在 e******i 的大作中提到】
: 貌似是100000吧,我记不清了,反正挺大的
avatar
f*e
41
别吵了,求最小周期,n久之前,caiwu出过类似题,我给答案就是O(N),我找找。

【在 e******i 的大作中提到】
: 昨天做了storm8 的online code,挂了。
: 题目变了,不再是以前说的find max sum path in one grid。
: 题目如下:
: 给定一个string,如 “codility”,每次向左循环一个char.
: codility 0th;
: odilityc 1st;
: dilityco 2nd;
: ilitycod 3rd;
: ....
: codility 8th;

avatar
e*i
42

二爷,我现在想就两个问题,一个是用了hashmap.而是用了Java的substring导致空间
复杂度超标了, 这两个的JAVA原理我都没有深究,substring我一直按o(1)来考虑,会
不会是O(n)啊,那样的话,那我的时间复杂度也错了。。。

【在 p*****2 的大作中提到】
:
: ZKSS

avatar
H*s
43
好像是,根据题目的例子应该是2

【在 e******i 的大作中提到】
:
: 二爷,我现在想就两个问题,一个是用了hashmap.而是用了Java的substring导致空间
: 复杂度超标了, 这两个的JAVA原理我都没有深究,substring我一直按o(1)来考虑,会
: 不会是O(n)啊,那样的话,那我的时间复杂度也错了。。。

avatar
p*2
44

substring O(n)
这题rolling hash, 不过要选mod的话,我就没有经验了。不知道应该怎么选择好。
再有就是KMP。mshearts说的。

【在 e******i 的大作中提到】
:
: 二爷,我现在想就两个问题,一个是用了hashmap.而是用了Java的substring导致空间
: 复杂度超标了, 这两个的JAVA原理我都没有深究,substring我一直按o(1)来考虑,会
: 不会是O(n)啊,那样的话,那我的时间复杂度也错了。。。

avatar
f*e
45
想到了,很简单,记前n个数的周期为k,当你碰到第n+1个数,不满足这个周期,该如何
update k?

【在 f*****e 的大作中提到】
: 别吵了,求最小周期,n久之前,caiwu出过类似题,我给答案就是O(N),我找找。
avatar
d*g
46

如何
不满足周期的话就说明前n+1个数不是周期的,应该暂设k=n+1吧,是这样么?

【在 f*****e 的大作中提到】
: 想到了,很简单,记前n个数的周期为k,当你碰到第n+1个数,不满足这个周期,该如何
: update k?

avatar
c*t
47
高!simple!

【在 f*****e 的大作中提到】
: 想到了,很简单,记前n个数的周期为k,当你碰到第n+1个数,不满足这个周期,该如何
: update k?

avatar
f*e
48
这个里面的reasoning相当有趣。

【在 d*********g 的大作中提到】
:
: 如何
: 不满足周期的话就说明前n+1个数不是周期的,应该暂设k=n+1吧,是这样么?

avatar
f*e
49
好像不对。不过思路是对的。

【在 d*********g 的大作中提到】
:
: 如何
: 不满足周期的话就说明前n+1个数不是周期的,应该暂设k=n+1吧,是这样么?

avatar
p*2
50

如何
byebye
开始第一个b,周期1
第二个y, 怎么检查周期呢?

【在 f*****e 的大作中提到】
: 想到了,很简单,记前n个数的周期为k,当你碰到第n+1个数,不满足这个周期,该如何
: update k?

avatar
f*e
51
b[i - k] != b[i], thus update k,具体怎么update的,我忘了,公式很简单,reaso
ning很tricky.

【在 p*****2 的大作中提到】
:
: 如何
: byebye
: 开始第一个b,周期1
: 第二个y, 怎么检查周期呢?

avatar
p*2
52

reaso
如果相等怎么办?

【在 f*****e 的大作中提到】
: b[i - k] != b[i], thus update k,具体怎么update的,我忘了,公式很简单,reaso
: ning很tricky.

avatar
p*2
53

大牛看明白了,写个code练练?

【在 c********t 的大作中提到】
: 高!simple!
avatar
f*e
54
相等就下一个字符呗。

【在 p*****2 的大作中提到】
:
: 大牛看明白了,写个code练练?

avatar
f*e
55
想想又好像是对的,caiwu的那个题比这个难,最小周期只是其中一部分。

【在 f*****e 的大作中提到】
: 相等就下一个字符呗。
avatar
p*2
56

没明白。能不能走个"byebye"的例子呢?

【在 f*****e 的大作中提到】
: 想想又好像是对的,caiwu的那个题比这个难,最小周期只是其中一部分。
avatar
f*e
57
update k=n+1是对的,数学证明真的很tricky。
A=byebye
A[0] == 'b', k = 1;
A[1] == 'y' != 'b' == A[1-k], update k = 2;
A[2] == 'e' != 'b' == A[2-k], update k = 3;
A[3] == 'b' == 'b' == A[3-k], continue
A[4] == 'y' == 'y' == A[4-k], continue
A[5] == 'e' == 'e' == A[5-k], continue
final k = 3,
there are 3 unique rotated sequences
pseudocode只有4行,4行code就可以搞定storm8的题目,不过这题太偏了。
int k=1;
for(int i = 1; i < A.size(); i++)
if(A[i] != A[i - k])
k = i + 1;

【在 p*****2 的大作中提到】
:
: 没明白。能不能走个"byebye"的例子呢?

avatar
c*t
58
啥时候我被你提鞋成大牛了,感觉是这个意思。
public int count(char[] str) {
int n = str.length, count = 0;
for (int i = 1; i < n;) {
if (str[i] != str[0]) {
count = i;
i++;
} else {
for (int j = 0; i < n && j < i && str[i] == str[j]; j++)
i++;
}
}
return count;
}

【在 p*****2 的大作中提到】
:
: 没明白。能不能走个"byebye"的例子呢?

avatar
m*1
59
我当时做这个test的方法跟你差不多,这样做过不了他的extreme large dataset的测
试,显示超时,然后我就跪了,后来我想到一个方法,不知道可行不可行,就是要组成
这个所谓的词组,必定是有特定substring重复出现,比如byebye是bye的重复两次,这
样,我想可不可以只找到当前string的长度,然后找到所有约数,也就是说约数长度的
substring重复n次才能构成当前string,比如abcdefgabcdefg,当前长度是14,重复
substring长度是7,这样,我们检查长度为2,7的substring就行了。这样快了很多
avatar
c*t
60
和大牛的一比,我的codes一把渣啊

【在 f*****e 的大作中提到】
: update k=n+1是对的,数学证明真的很tricky。
: A=byebye
: A[0] == 'b', k = 1;
: A[1] == 'y' != 'b' == A[1-k], update k = 2;
: A[2] == 'e' != 'b' == A[2-k], update k = 3;
: A[3] == 'b' == 'b' == A[3-k], continue
: A[4] == 'y' == 'y' == A[4-k], continue
: A[5] == 'e' == 'e' == A[5-k], continue
: final k = 3,
: there are 3 unique rotated sequences

avatar
f*e
61
这题的证明outline如下:
1)假设前n个元素的最小周期为k, 加入新元素后的新的最小周期j不可能前n个元素的最小周期为k矛盾。
2)假设前n个元素的最小周期为k, 加入新元素后的新的最小周期j不可能k然A[0,...,j%k]也是前n个元素的重复串,但是长度所以j只能是n+1。

【在 f*****e 的大作中提到】
: update k=n+1是对的,数学证明真的很tricky。
: A=byebye
: A[0] == 'b', k = 1;
: A[1] == 'y' != 'b' == A[1-k], update k = 2;
: A[2] == 'e' != 'b' == A[2-k], update k = 3;
: A[3] == 'b' == 'b' == A[3-k], continue
: A[4] == 'y' == 'y' == A[4-k], continue
: A[5] == 'e' == 'e' == A[5-k], continue
: final k = 3,
: there are 3 unique rotated sequences

avatar
p*2
62

这题你的greedy算法感觉是对的,我没有找到反例。但是我也在考虑怎么证明呢。感觉
这题的关键就是substr以后,可以从下一个开始了,前边的都可以抛弃掉了。

【在 f*****e 的大作中提到】
: 这题的证明outline如下:
: 1)假设前n个元素的最小周期为k, 加入新元素后的新的最小周期j不可能: 前n个元素的最小周期为k矛盾。
: 2)假设前n个元素的最小周期为k, 加入新元素后的新的最小周期j不可能k: 然A[0,...,j%k]也是前n个元素的重复串,但是长度: 所以j只能是n+1。

avatar
f*e
63
我说的就是文献的内容,我刚才凭记忆又证明了一遍,你可以在书上画画,从最简单的
case考察起,比如1.5个周期加一个不符合周期的元素。

【在 p*****2 的大作中提到】
:
: 这题你的greedy算法感觉是对的,我没有找到反例。但是我也在考虑怎么证明呢。感觉
: 这题的关键就是substr以后,可以从下一个开始了,前边的都可以抛弃掉了。

avatar
b*6
64
前些天我也看到这个题,顺手写了一下:思路是找到s.length()的所有prime factor,
然后看根据这个factor移位是不是满足题的条件,如果是,结果加length/factor - 1
public static int cyclic(String s)
{
int len = s.length();

if (len <= 1)
return 1;

int result = 1;

ArrayList factors = get_factors(len);
for (int fctr : factors)
{
if (valid_cyclic(s, fctr))
result += len / fctr - 1;
}

return result;
}
static boolean valid_cyclic(String s, int v) {
for (int i = 0, j = v; i < s.length(); i++, j++) {
if (j == s.length())
j = 0;
if (s.charAt(i) != s.charAt(j))
return false;
}
return true;
}
// find all prime factors plus one
static ArrayList get_factors(int val) {
ArrayList result = new ArrayList();
result.add(1);

int cur = 2;
do {
if (val % cur == 0)
{
result.add(cur);
do {
val /= cur;
} while (val % cur == 0);
}
cur++;
} while (cur <= val);
return result;
}
avatar
b*6
65
上面这个算法复杂度,假如输入字符串长度是N,O(N * (number of prime factors of
N)),数学上是不是等价于O(N)我就不知道了
avatar
p*2
66

这个例子能过吗?"aadaaad"?

【在 f*****e 的大作中提到】
: update k=n+1是对的,数学证明真的很tricky。
: A=byebye
: A[0] == 'b', k = 1;
: A[1] == 'y' != 'b' == A[1-k], update k = 2;
: A[2] == 'e' != 'b' == A[2-k], update k = 3;
: A[3] == 'b' == 'b' == A[3-k], continue
: A[4] == 'y' == 'y' == A[4-k], continue
: A[5] == 'e' == 'e' == A[5-k], continue
: final k = 3,
: there are 3 unique rotated sequences

avatar
f*e
67
周期为7,有7个?
aadaaad
adaaada
daaadaa
aaadaad
aadaada
adaadaa
daadaaa

【在 p*****2 的大作中提到】
:
: 这个例子能过吗?"aadaaad"?

avatar
l*i
68
看到大牛,服气了。

【在 f*****e 的大作中提到】
: update k=n+1是对的,数学证明真的很tricky。
: A=byebye
: A[0] == 'b', k = 1;
: A[1] == 'y' != 'b' == A[1-k], update k = 2;
: A[2] == 'e' != 'b' == A[2-k], update k = 3;
: A[3] == 'b' == 'b' == A[3-k], continue
: A[4] == 'y' == 'y' == A[4-k], continue
: A[5] == 'e' == 'e' == A[5-k], continue
: final k = 3,
: there are 3 unique rotated sequences

avatar
p*2
69

不过意思。我看错了。

【在 f*****e 的大作中提到】
: 周期为7,有7个?
: aadaaad
: adaaada
: daaadaa
: aaadaad
: aadaada
: adaadaa
: daadaaa

avatar
c*s
70
好像不对吧:
比如 ababa
i = 1, k = 2
i = 2, k = 2
i = 3, k = 2
i = 4, k = 2
但这里 k应该等于5

【在 f*****e 的大作中提到】
: update k=n+1是对的,数学证明真的很tricky。
: A=byebye
: A[0] == 'b', k = 1;
: A[1] == 'y' != 'b' == A[1-k], update k = 2;
: A[2] == 'e' != 'b' == A[2-k], update k = 3;
: A[3] == 'b' == 'b' == A[3-k], continue
: A[4] == 'y' == 'y' == A[4-k], continue
: A[5] == 'e' == 'e' == A[5-k], continue
: final k = 3,
: there are 3 unique rotated sequences

avatar
p*2
71

str+str 找到长度为n的match

【在 c***s 的大作中提到】
: 好像不对吧:
: 比如 ababa
: i = 1, k = 2
: i = 2, k = 2
: i = 3, k = 2
: i = 4, k = 2
: 但这里 k应该等于5

avatar
p*2
72

这题面到肯定跪了。

【在 l****i 的大作中提到】
: 看到大牛,服气了。
avatar
f*e
73
没有违反周期性啊。A[i-k]!=A[i]

【在 c***s 的大作中提到】
: 好像不对吧:
: 比如 ababa
: i = 1, k = 2
: i = 2, k = 2
: i = 3, k = 2
: i = 4, k = 2
: 但这里 k应该等于5

avatar
d*x
74
一般还是能想到 str+str 然后kmp或者hash的吧
利用周期性确实太巧妙了。

【在 p*****2 的大作中提到】
:
: 这题面到肯定跪了。

avatar
c*s
75
但这个周期是5吧。
难道我看错题目了?

【在 f*****e 的大作中提到】
: 没有违反周期性啊。A[i-k]!=A[i]
avatar
p*9
76
相当于找这个字符串的最小循环节的长度,求出kmp算法的next数组,假设字符串长度
为N,最小循环节的长度是 N - next[N] 同时要求 N % (N - next[N]) == 0
avatar
l*i
77
storm8刚给我发了online test的link.......

【在 p*****2 的大作中提到】
:
: 这题面到肯定跪了。

avatar
c*t
78
还真有点问题
ababa+ababa

【在 p*****2 的大作中提到】
:
: 这题面到肯定跪了。

avatar
l*i
79
byeby,这个K最后也是3?
但是按照题目,这个应该输出5吧.
byeby
yebyb
ebyby
bybye
ybyeb

【在 f*****e 的大作中提到】
: update k=n+1是对的,数学证明真的很tricky。
: A=byebye
: A[0] == 'b', k = 1;
: A[1] == 'y' != 'b' == A[1-k], update k = 2;
: A[2] == 'e' != 'b' == A[2-k], update k = 3;
: A[3] == 'b' == 'b' == A[3-k], continue
: A[4] == 'y' == 'y' == A[4-k], continue
: A[5] == 'e' == 'e' == A[5-k], continue
: final k = 3,
: there are 3 unique rotated sequences

avatar
f*e
80
还真是,想想再怎么改改。

【在 l****i 的大作中提到】
: byeby,这个K最后也是3?
: 但是按照题目,这个应该输出5吧.
: byeby
: yebyb
: ebyby
: bybye
: ybyeb

avatar
f*e
81
延长之后继续求周期也可以,只要周期不大于长度就行。复杂度还是O(N),未经
验证,慎用:-)
byebybyeby
35
stop

【在 f*****e 的大作中提到】
: 还真是,想想再怎么改改。
avatar
e*s
82
二爷,能过

【在 p*****2 的大作中提到】
:
: 这题面到肯定跪了。

avatar
e*i
83
擦,真心跪了,我找了HR要了test的结果,各位大牛看看吧,貌似我题目理解错了?
extreme_single_letter
single letter
0.25 s. WRONG ANSWER got 0 expected 1
extreme_a5
a*5
0.24 s. WRONG ANSWER got 0 expected 5
medium1
ab*1000
0.31 s. WRONG ANSWER got 1 expected 1000
好可惜。。这个教训好深刻
avatar
l*i
84
没看懂...是哪3个test cases?

【在 e******i 的大作中提到】
: 擦,真心跪了,我找了HR要了test的结果,各位大牛看看吧,貌似我题目理解错了?
: extreme_single_letter
: single letter
: 0.25 s. WRONG ANSWER got 0 expected 1
: extreme_a5
: a*5
: 0.24 s. WRONG ANSWER got 0 expected 5
: medium1
: ab*1000
: 0.31 s. WRONG ANSWER got 1 expected 1000

avatar
l*5
85
。。。所以是求最小周期的重复次数?学名叫什么来着。 。。。。

【在 e******i 的大作中提到】
: 擦,真心跪了,我找了HR要了test的结果,各位大牛看看吧,貌似我题目理解错了?
: extreme_single_letter
: single letter
: 0.25 s. WRONG ANSWER got 0 expected 1
: extreme_a5
: a*5
: 0.24 s. WRONG ANSWER got 0 expected 5
: medium1
: ab*1000
: 0.31 s. WRONG ANSWER got 1 expected 1000

avatar
s*y
86
3个test case是啥?
avatar
l*5
87
single letter
a*5
ab*1000

【在 s***y 的大作中提到】
: 3个test case是啥?
avatar
e*s
88
ab*1000 expect 1000?
avatar
p*2
89

能想到。不过online test不好写呀。hash那个,我不清楚怎么选mod。kmp我从来也没
写过。不知道能不能写对,通过test case呢。话说tc用到kmp的时候多不多呀?

【在 d**********x 的大作中提到】
: 一般还是能想到 str+str 然后kmp或者hash的吧
: 利用周期性确实太巧妙了。

avatar
p*2
90

不是一个题呀。

【在 e******i 的大作中提到】
: 擦,真心跪了,我找了HR要了test的结果,各位大牛看看吧,貌似我题目理解错了?
: extreme_single_letter
: single letter
: 0.25 s. WRONG ANSWER got 0 expected 1
: extreme_a5
: a*5
: 0.24 s. WRONG ANSWER got 0 expected 5
: medium1
: ab*1000
: 0.31 s. WRONG ANSWER got 1 expected 1000

avatar
p*2
91

这道题说了一定是O(n)吗?按照数据的规模,感觉nlogn应该能过呀。

【在 e******i 的大作中提到】
: 擦,真心跪了,我找了HR要了test的结果,各位大牛看看吧,貌似我题目理解错了?
: extreme_single_letter
: single letter
: 0.25 s. WRONG ANSWER got 0 expected 1
: extreme_a5
: a*5
: 0.24 s. WRONG ANSWER got 0 expected 5
: medium1
: ab*1000
: 0.31 s. WRONG ANSWER got 1 expected 1000

avatar
m*s
92
好像最近只见过一道用kmp来dp的。。。srm 557 div 2 1000

【在 p*****2 的大作中提到】
:
: 这道题说了一定是O(n)吗?按照数据的规模,感觉nlogn应该能过呀。

avatar
p*2
93

多谢大牛。有时间得练练kmp了。看了一下感觉还挺麻烦的。

【在 m******s 的大作中提到】
: 好像最近只见过一道用kmp来dp的。。。srm 557 div 2 1000
avatar
w*p
94


【在 H****s 的大作中提到】
: 这个题目 先将string 复制级联然后每次shift一位判断是否相等
: 如 "codility" --> "codilitycodility" 然后再跟原string 判断就行了!

avatar
x*y
95
不重复的单词个数是 最小周期数。
然后每个不重复单词出现的次数是一样的。根据这两个推论,可以直接append
original str, 然后kmp查找最先出现的次数找到最小周期
avatar
H*s
96
对, 除非用rolling hash 或 KMP 否则就是O(N^2). 上个班的功夫怎么就这么多回帖
啦,慢慢看吧。

【在 p*****2 的大作中提到】
:
: 多谢大牛。有时间得练练kmp了。看了一下感觉还挺麻烦的。

avatar
e*i
97

说了,我看了大case,我还是超时了几十毫秒的样子

【在 p*****2 的大作中提到】
:
: 多谢大牛。有时间得练练kmp了。看了一下感觉还挺麻烦的。

avatar
e*i
98


【在 H****s 的大作中提到】
: 对, 除非用rolling hash 或 KMP 否则就是O(N^2). 上个班的功夫怎么就这么多回帖
: 啦,慢慢看吧。

avatar
p*2
99

要求是多少?2秒?你是用O(n)的解做的吗?

【在 e******i 的大作中提到】

avatar
e*i
100

要求是1.04,我做了1.6.。。。sigh,总之是做错了

【在 p*****2 的大作中提到】
:
: 要求是多少?2秒?你是用O(n)的解做的吗?

avatar
g*y
101
为啥ab×1000是1000?不应该是2吗?

【在 e******i 的大作中提到】
:
: 要求是1.04,我做了1.6.。。。sigh,总之是做错了

avatar
p*2
102

how about "aabaaaba"?
aabaaabaaabaaaba
abaaabaaabaaabaa
baaabaaabaaabaaa
aaabaaabaaabaaab
aabaaabaaabaaaba

【在 e***s 的大作中提到】
: 二爷,能过
avatar
p*2
103

你的复杂度是多少?

【在 e******i 的大作中提到】
:
: 要求是1.04,我做了1.6.。。。sigh,总之是做错了

avatar
c*t
104
这样行不?
public int count2(char[] str) {
int n = str.length, count = 1;
for (int i = 1; i < n;i++) {
if (str[i] != str[i-count]) {
count = i+1;
}
}
return count>n/2? n/2: count;
}

【在 f*****e 的大作中提到】
: 还真是,想想再怎么改改。
avatar
c*t
105
看看的改进版,在楼上。

【在 p*****2 的大作中提到】
:
: 你的复杂度是多少?

avatar
p*2
106

你的改进版的计算结果是多少?

【在 c********t 的大作中提到】
: 看看的改进版,在楼上。
avatar
c*t
107
嗯,还是不行,看来每个字母都要从头比较,还是要N^2算法才行。
KMP感觉在这道题不好用。

【在 p*****2 的大作中提到】
:
: 你的改进版的计算结果是多少?

avatar
c*t
108
现在看来,这个解法似乎最优。不过应该是所有factor,而不是所有prime factor吧。
all factor of a num 似乎是个sqrt(n)数量级。

1

【在 b*****6 的大作中提到】
: 前些天我也看到这个题,顺手写了一下:思路是找到s.length()的所有prime factor,
: 然后看根据这个factor移位是不是满足题的条件,如果是,结果加length/factor - 1
: public static int cyclic(String s)
: {
: int len = s.length();
:
: if (len <= 1)
: return 1;
:
: int result = 1;

avatar
c*t
109
嗯,就是你这个算法,O(n*sqrt(n)),改了改ben5736的codes 不知过不过的了大case;
public static int cyclic(String s) {
int len = s.length();
if (len <= 1)
return 1;
ArrayList factors = get_factors(len);
for (int i = factors.size() - 1; i >= 0; i--) {
int fctr = factors.get(i);
if (valid_cyclic(s, fctr))
return fctr;
}
return len;
}
static boolean valid_cyclic(String s, int v) {
for (int i = 0, j = v; i < s.length(); i++, j++) {
if (j == s.length())
j = 0;
if (s.charAt(i) != s.charAt(j))
return false;
}
return true;
}
static ArrayList get_factors(int val) {
ArrayList result = new ArrayList();
result.add(1);
int cur = 2;
do {
if (val % cur == 0) {
result.add(cur);
}
cur++;
} while (cur <= val / 2);
return result;
}

【在 m*****1 的大作中提到】
: 我当时做这个test的方法跟你差不多,这样做过不了他的extreme large dataset的测
: 试,显示超时,然后我就跪了,后来我想到一个方法,不知道可行不可行,就是要组成
: 这个所谓的词组,必定是有特定substring重复出现,比如byebye是bye的重复两次,这
: 样,我想可不可以只找到当前string的长度,然后找到所有约数,也就是说约数长度的
: substring重复n次才能构成当前string,比如abcdefgabcdefg,当前长度是14,重复
: substring长度是7,这样,我们检查长度为2,7的substring就行了。这样快了很多

avatar
e*i
110
昨天做了storm8 的online code,挂了。
题目变了,不再是以前说的find max sum path in one grid。
题目如下:
给定一个string,如 “codility”,每次向左循环一个char.
codility 0th;
odilityc 1st;
dilityco 2nd;
ilitycod 3rd;
....
codility 8th;
要求返回Unique 的string. 如上所示,应当返回 7.
然后又举例,“byebye”,应当返回二
任何string,包括空数组,应当最少返回1.
要求time complexity 和 space complexity 都为O(N).
我的code:
import java.util.HashMap;
public class Cyclic {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
String s = "";
System.out.println(cyclic_automorphisms(s));
}

public static int cyclic_automorphisms ( String S ) {
int lens = S.length();
HashMap map = new HashMap();
if(lens < 1)
return 0;
for(int i = 0; i < lens; i++){
if(!map.containsKey(S)){
map.put(S,i);
}
S = shiftLeft(S);
}
return map.size()-1;
}

public static String shiftLeft(String s){
return s.substring(1)+s.charAt(0);
}
}
在eclipse里测试,没有问题,也通过了测试,但他说我这个不是最优解。
我当时第一反应就是用Hashmap做,从前也没有想过哈希表的空间复杂度问题。我想是
不是跪在这个地方了,求大神指点。
另外,求大神Refer.
avatar
e*i
111
上面的code是我在eclipse里面测试写的
avatar
l*i
112
用Set?
avatar
e*i
113

不知道啊,以前做题都没有想过这个问题,而且不是说他们的问题对空间复杂度要求不
高么

【在 l****i 的大作中提到】
: 用Set?
avatar
j*y
114
为什么是返回7阿,这个unique的string没想明白

【在 e******i 的大作中提到】
: 昨天做了storm8 的online code,挂了。
: 题目变了,不再是以前说的find max sum path in one grid。
: 题目如下:
: 给定一个string,如 “codility”,每次向左循环一个char.
: codility 0th;
: odilityc 1st;
: dilityco 2nd;
: ilitycod 3rd;
: ....
: codility 8th;

avatar
p*2
115
然后又举例,“byebye”,应当返回二
这个为什么是2?
avatar
H*s
116
这个题目 先将string 复制级联然后每次shift一位判断是否相等
如 "codility" --> "codilitycodility" 然后再跟原string 判断就行了!

【在 e******i 的大作中提到】
: 昨天做了storm8 的online code,挂了。
: 题目变了,不再是以前说的find max sum path in one grid。
: 题目如下:
: 给定一个string,如 “codility”,每次向左循环一个char.
: codility 0th;
: odilityc 1st;
: dilityco 2nd;
: ilitycod 3rd;
: ....
: codility 8th;

avatar
M*5
117
好像原来的题目意思是这样子的,有一个string,如果string的length为len,那么可
以循环移位[0,len-1],如果循环移位后得到的string和原来的string一样,那么就
count++,因为循环移位为0的时候得到的string肯定是跟原来的string一样的,所以
count至少为1。。。反正我是这样理解的,不知道对不对?
avatar
p*2
118
是不是要用那个叫什么rolling hashing一类的东西来作了?
avatar
M*5
119
嗯,我觉得这个是最优解。。。

【在 H****s 的大作中提到】
: 这个题目 先将string 复制级联然后每次shift一位判断是否相等
: 如 "codility" --> "codilitycodility" 然后再跟原string 判断就行了!

avatar
H*s
120
对啊, 应该是3啊

【在 p*****2 的大作中提到】
: 然后又举例,“byebye”,应当返回二
: 这个为什么是2?

avatar
p*2
121

这个是O(n)的吗?

【在 M********5 的大作中提到】
: 嗯,我觉得这个是最优解。。。
avatar
M*5
122
byebye移0和3得到的string和原来的string一样,所以是2吧,是这样理解的吧?

【在 H****s 的大作中提到】
: 对啊, 应该是3啊
avatar
M*5
123
这个应该是空间时间都是O(n)的吧。。。我当时做的应该是空间是O(n^2)的,其实这题
就是这样一个trick

【在 p*****2 的大作中提到】
:
: 这个是O(n)的吗?

avatar
e*i
124

我觉得可能没有那么复杂

【在 p*****2 的大作中提到】
: 是不是要用那个叫什么rolling hashing一类的东西来作了?
avatar
e*i
125

因为从0开始排序啊,有3个,所以返回2

【在 p*****2 的大作中提到】
: 然后又举例,“byebye”,应当返回二
: 这个为什么是2?

avatar
p*2
126
n的大小是多少呢?
avatar
e*i
127

当时我也想到了这个算法,有点类似cracking 上的一道题,后来觉得hashmap简单就没
有细想了

【在 H****s 的大作中提到】
: 这个题目 先将string 复制级联然后每次shift一位判断是否相等
: 如 "codility" --> "codilitycodility" 然后再跟原string 判断就行了!

avatar
M*5
128
int CountString(std::string& str){
if( str.empty() )
return 0;
std::string shift_copy = str + str;
int count=0;
int len = str.length();
for(int i=0; iif( shift_copy.substr(i,len) == str )
count++;
}
return count;
}
avatar
p*2
129

没看明白。每次shift一位之后怎么比较呢?

【在 H****s 的大作中提到】
: 这个题目 先将string 复制级联然后每次shift一位判断是否相等
: 如 "codility" --> "codilitycodility" 然后再跟原string 判断就行了!

avatar
p*2
130

任何string,包括空数组,应当最少返回1.
这个怎么理解?

【在 e******i 的大作中提到】
:
: 当时我也想到了这个算法,有点类似cracking 上的一道题,后来觉得hashmap简单就没
: 有细想了

avatar
M*5
131
我跟你理解的好像不一样,我理解错了?

【在 e******i 的大作中提到】
:
: 当时我也想到了这个算法,有点类似cracking 上的一道题,后来觉得hashmap简单就没
: 有细想了

avatar
p*2
132

你这个不是O(n)的。

【在 M********5 的大作中提到】
: int CountString(std::string& str){
: if( str.empty() )
: return 0;
: std::string shift_copy = str + str;
: int count=0;
: int len = str.length();
: for(int i=0; i: if( shift_copy.substr(i,len) == str )
: count++;
: }

avatar
M*5
133
两倍的space还是算O(n)吧?

【在 p*****2 的大作中提到】
:
: 你这个不是O(n)的。

avatar
e*i
134


【在 p*****2 的大作中提到】
:
: 你这个不是O(n)的。

avatar
p*2
135

我是说时间。

【在 M********5 的大作中提到】
: 两倍的space还是算O(n)吧?
avatar
e*i
136

hashmap是o(n)么
你是说我写的么

【在 M********5 的大作中提到】
: 这个应该是空间时间都是O(n)的吧。。。我当时做的应该是空间是O(n^2)的,其实这题
: 就是这样一个trick

avatar
p*2
137

LZ说说N的范围是多少?

【在 e******i 的大作中提到】
:
: hashmap是o(n)么
: 你是说我写的么

avatar
M*5
138
如果这个string是aaaaa,那space是不是O(n^2)

【在 e******i 的大作中提到】
:
: hashmap是o(n)么
: 你是说我写的么

avatar
p*2
139
我目前的想法就是rolling hashing了。如果N不大好些,如果N很大,需要点数学知识
了。
avatar
w*x
140

同跪,今天给Zynga跪了, 最近跪的几家都是代码还来不及写就给据了,NND

【在 e******i 的大作中提到】
: 昨天做了storm8 的online code,挂了。
: 题目变了,不再是以前说的find max sum path in one grid。
: 题目如下:
: 给定一个string,如 “codility”,每次向左循环一个char.
: codility 0th;
: odilityc 1st;
: dilityco 2nd;
: ilitycod 3rd;
: ....
: codility 8th;

avatar
M*5
141
为什么这个时间不是O(n),不是总共循环n次吗?

【在 p*****2 的大作中提到】
: 我目前的想法就是rolling hashing了。如果N不大好些,如果N很大,需要点数学知识
: 了。

avatar
e*i
142
貌似是100000吧,我记不清了,反正挺大的

【在 p*****2 的大作中提到】
: 我目前的想法就是rolling hashing了。如果N不大好些,如果N很大,需要点数学知识
: 了。

avatar
p*2
143

仔细看看。你这个是O(n^2)。这题哪里会那么简单呢。你仔细分析一下复杂度。

【在 M********5 的大作中提到】
: 为什么这个时间不是O(n),不是总共循环n次吗?
avatar
p*2
144

这个也可以。

【在 m******s 的大作中提到】
: s匹配ss,KMP?
avatar
p*2
145

ZKSS

【在 w****x 的大作中提到】
:
: 同跪,今天给Zynga跪了, 最近跪的几家都是代码还来不及写就给据了,NND

avatar
M*5
146
嗯,好像是这个数。。。

【在 e******i 的大作中提到】
: 貌似是100000吧,我记不清了,反正挺大的
avatar
f*e
147
别吵了,求最小周期,n久之前,caiwu出过类似题,我给答案就是O(N),我找找。

【在 e******i 的大作中提到】
: 昨天做了storm8 的online code,挂了。
: 题目变了,不再是以前说的find max sum path in one grid。
: 题目如下:
: 给定一个string,如 “codility”,每次向左循环一个char.
: codility 0th;
: odilityc 1st;
: dilityco 2nd;
: ilitycod 3rd;
: ....
: codility 8th;

avatar
e*i
148

二爷,我现在想就两个问题,一个是用了hashmap.而是用了Java的substring导致空间
复杂度超标了, 这两个的JAVA原理我都没有深究,substring我一直按o(1)来考虑,会
不会是O(n)啊,那样的话,那我的时间复杂度也错了。。。

【在 p*****2 的大作中提到】
:
: ZKSS

avatar
H*s
149
好像是,根据题目的例子应该是2

【在 e******i 的大作中提到】
:
: 二爷,我现在想就两个问题,一个是用了hashmap.而是用了Java的substring导致空间
: 复杂度超标了, 这两个的JAVA原理我都没有深究,substring我一直按o(1)来考虑,会
: 不会是O(n)啊,那样的话,那我的时间复杂度也错了。。。

avatar
p*2
150

substring O(n)
这题rolling hash, 不过要选mod的话,我就没有经验了。不知道应该怎么选择好。
再有就是KMP。mshearts说的。

【在 e******i 的大作中提到】
:
: 二爷,我现在想就两个问题,一个是用了hashmap.而是用了Java的substring导致空间
: 复杂度超标了, 这两个的JAVA原理我都没有深究,substring我一直按o(1)来考虑,会
: 不会是O(n)啊,那样的话,那我的时间复杂度也错了。。。

avatar
f*e
151
想到了,很简单,记前n个数的周期为k,当你碰到第n+1个数,不满足这个周期,该如何
update k?

【在 f*****e 的大作中提到】
: 别吵了,求最小周期,n久之前,caiwu出过类似题,我给答案就是O(N),我找找。
avatar
d*g
152

如何
不满足周期的话就说明前n+1个数不是周期的,应该暂设k=n+1吧,是这样么?

【在 f*****e 的大作中提到】
: 想到了,很简单,记前n个数的周期为k,当你碰到第n+1个数,不满足这个周期,该如何
: update k?

avatar
c*t
153
高!simple!

【在 f*****e 的大作中提到】
: 想到了,很简单,记前n个数的周期为k,当你碰到第n+1个数,不满足这个周期,该如何
: update k?

avatar
f*e
154
这个里面的reasoning相当有趣。

【在 d*********g 的大作中提到】
:
: 如何
: 不满足周期的话就说明前n+1个数不是周期的,应该暂设k=n+1吧,是这样么?

avatar
f*e
155
好像不对。不过思路是对的。

【在 d*********g 的大作中提到】
:
: 如何
: 不满足周期的话就说明前n+1个数不是周期的,应该暂设k=n+1吧,是这样么?

avatar
p*2
156

如何
byebye
开始第一个b,周期1
第二个y, 怎么检查周期呢?

【在 f*****e 的大作中提到】
: 想到了,很简单,记前n个数的周期为k,当你碰到第n+1个数,不满足这个周期,该如何
: update k?

avatar
f*e
157
b[i - k] != b[i], thus update k,具体怎么update的,我忘了,公式很简单,reaso
ning很tricky.

【在 p*****2 的大作中提到】
:
: 如何
: byebye
: 开始第一个b,周期1
: 第二个y, 怎么检查周期呢?

avatar
p*2
158

reaso
如果相等怎么办?

【在 f*****e 的大作中提到】
: b[i - k] != b[i], thus update k,具体怎么update的,我忘了,公式很简单,reaso
: ning很tricky.

avatar
p*2
159

大牛看明白了,写个code练练?

【在 c********t 的大作中提到】
: 高!simple!
avatar
f*e
160
相等就下一个字符呗。

【在 p*****2 的大作中提到】
:
: 大牛看明白了,写个code练练?

avatar
f*e
161
想想又好像是对的,caiwu的那个题比这个难,最小周期只是其中一部分。

【在 f*****e 的大作中提到】
: 相等就下一个字符呗。
avatar
p*2
162

没明白。能不能走个"byebye"的例子呢?

【在 f*****e 的大作中提到】
: 想想又好像是对的,caiwu的那个题比这个难,最小周期只是其中一部分。
avatar
f*e
163
update k=n+1是对的,数学证明真的很tricky。
A=byebye
A[0] == 'b', k = 1;
A[1] == 'y' != 'b' == A[1-k], update k = 2;
A[2] == 'e' != 'b' == A[2-k], update k = 3;
A[3] == 'b' == 'b' == A[3-k], continue
A[4] == 'y' == 'y' == A[4-k], continue
A[5] == 'e' == 'e' == A[5-k], continue
final k = 3,
there are 3 unique rotated sequences
pseudocode只有4行,4行code就可以搞定storm8的题目,不过这题太偏了。
int k=1;
for(int i = 1; i < A.size(); i++)
if(A[i] != A[i - k])
k = i + 1;

【在 p*****2 的大作中提到】
:
: 没明白。能不能走个"byebye"的例子呢?

avatar
c*t
164
啥时候我被你提鞋成大牛了,感觉是这个意思。
public int count(char[] str) {
int n = str.length, count = 0;
for (int i = 1; i < n;) {
if (str[i] != str[0]) {
count = i;
i++;
} else {
for (int j = 0; i < n && j < i && str[i] == str[j]; j++)
i++;
}
}
return count;
}

【在 p*****2 的大作中提到】
:
: 没明白。能不能走个"byebye"的例子呢?

avatar
m*1
165
我当时做这个test的方法跟你差不多,这样做过不了他的extreme large dataset的测
试,显示超时,然后我就跪了,后来我想到一个方法,不知道可行不可行,就是要组成
这个所谓的词组,必定是有特定substring重复出现,比如byebye是bye的重复两次,这
样,我想可不可以只找到当前string的长度,然后找到所有约数,也就是说约数长度的
substring重复n次才能构成当前string,比如abcdefgabcdefg,当前长度是14,重复
substring长度是7,这样,我们检查长度为2,7的substring就行了。这样快了很多
avatar
c*t
166
和大牛的一比,我的codes一把渣啊

【在 f*****e 的大作中提到】
: update k=n+1是对的,数学证明真的很tricky。
: A=byebye
: A[0] == 'b', k = 1;
: A[1] == 'y' != 'b' == A[1-k], update k = 2;
: A[2] == 'e' != 'b' == A[2-k], update k = 3;
: A[3] == 'b' == 'b' == A[3-k], continue
: A[4] == 'y' == 'y' == A[4-k], continue
: A[5] == 'e' == 'e' == A[5-k], continue
: final k = 3,
: there are 3 unique rotated sequences

avatar
f*e
167
这题的证明outline如下:
1)假设前n个元素的最小周期为k, 加入新元素后的新的最小周期j不可能前n个元素的最小周期为k矛盾。
2)假设前n个元素的最小周期为k, 加入新元素后的新的最小周期j不可能k然A[0,...,j%k]也是前n个元素的重复串,但是长度所以j只能是n+1。

【在 f*****e 的大作中提到】
: update k=n+1是对的,数学证明真的很tricky。
: A=byebye
: A[0] == 'b', k = 1;
: A[1] == 'y' != 'b' == A[1-k], update k = 2;
: A[2] == 'e' != 'b' == A[2-k], update k = 3;
: A[3] == 'b' == 'b' == A[3-k], continue
: A[4] == 'y' == 'y' == A[4-k], continue
: A[5] == 'e' == 'e' == A[5-k], continue
: final k = 3,
: there are 3 unique rotated sequences

avatar
p*2
168

这题你的greedy算法感觉是对的,我没有找到反例。但是我也在考虑怎么证明呢。感觉
这题的关键就是substr以后,可以从下一个开始了,前边的都可以抛弃掉了。

【在 f*****e 的大作中提到】
: 这题的证明outline如下:
: 1)假设前n个元素的最小周期为k, 加入新元素后的新的最小周期j不可能: 前n个元素的最小周期为k矛盾。
: 2)假设前n个元素的最小周期为k, 加入新元素后的新的最小周期j不可能k: 然A[0,...,j%k]也是前n个元素的重复串,但是长度: 所以j只能是n+1。

avatar
f*e
169
我说的就是文献的内容,我刚才凭记忆又证明了一遍,你可以在书上画画,从最简单的
case考察起,比如1.5个周期加一个不符合周期的元素。

【在 p*****2 的大作中提到】
:
: 这题你的greedy算法感觉是对的,我没有找到反例。但是我也在考虑怎么证明呢。感觉
: 这题的关键就是substr以后,可以从下一个开始了,前边的都可以抛弃掉了。

avatar
b*6
170
前些天我也看到这个题,顺手写了一下:思路是找到s.length()的所有prime factor,
然后看根据这个factor移位是不是满足题的条件,如果是,结果加length/factor - 1
public static int cyclic(String s)
{
int len = s.length();

if (len <= 1)
return 1;

int result = 1;

ArrayList factors = get_factors(len);
for (int fctr : factors)
{
if (valid_cyclic(s, fctr))
result += len / fctr - 1;
}

return result;
}
static boolean valid_cyclic(String s, int v) {
for (int i = 0, j = v; i < s.length(); i++, j++) {
if (j == s.length())
j = 0;
if (s.charAt(i) != s.charAt(j))
return false;
}
return true;
}
// find all prime factors plus one
static ArrayList get_factors(int val) {
ArrayList result = new ArrayList();
result.add(1);

int cur = 2;
do {
if (val % cur == 0)
{
result.add(cur);
do {
val /= cur;
} while (val % cur == 0);
}
cur++;
} while (cur <= val);
return result;
}
avatar
b*6
171
上面这个算法复杂度,假如输入字符串长度是N,O(N * (number of prime factors of
N)),数学上是不是等价于O(N)我就不知道了
avatar
p*2
172

这个例子能过吗?"aadaaad"?

【在 f*****e 的大作中提到】
: update k=n+1是对的,数学证明真的很tricky。
: A=byebye
: A[0] == 'b', k = 1;
: A[1] == 'y' != 'b' == A[1-k], update k = 2;
: A[2] == 'e' != 'b' == A[2-k], update k = 3;
: A[3] == 'b' == 'b' == A[3-k], continue
: A[4] == 'y' == 'y' == A[4-k], continue
: A[5] == 'e' == 'e' == A[5-k], continue
: final k = 3,
: there are 3 unique rotated sequences

avatar
f*e
173
周期为7,有7个?
aadaaad
adaaada
daaadaa
aaadaad
aadaada
adaadaa
daadaaa

【在 p*****2 的大作中提到】
:
: 这个例子能过吗?"aadaaad"?

avatar
l*i
174
看到大牛,服气了。

【在 f*****e 的大作中提到】
: update k=n+1是对的,数学证明真的很tricky。
: A=byebye
: A[0] == 'b', k = 1;
: A[1] == 'y' != 'b' == A[1-k], update k = 2;
: A[2] == 'e' != 'b' == A[2-k], update k = 3;
: A[3] == 'b' == 'b' == A[3-k], continue
: A[4] == 'y' == 'y' == A[4-k], continue
: A[5] == 'e' == 'e' == A[5-k], continue
: final k = 3,
: there are 3 unique rotated sequences

avatar
p*2
175

不过意思。我看错了。

【在 f*****e 的大作中提到】
: 周期为7,有7个?
: aadaaad
: adaaada
: daaadaa
: aaadaad
: aadaada
: adaadaa
: daadaaa

avatar
c*s
176
好像不对吧:
比如 ababa
i = 1, k = 2
i = 2, k = 2
i = 3, k = 2
i = 4, k = 2
但这里 k应该等于5

【在 f*****e 的大作中提到】
: update k=n+1是对的,数学证明真的很tricky。
: A=byebye
: A[0] == 'b', k = 1;
: A[1] == 'y' != 'b' == A[1-k], update k = 2;
: A[2] == 'e' != 'b' == A[2-k], update k = 3;
: A[3] == 'b' == 'b' == A[3-k], continue
: A[4] == 'y' == 'y' == A[4-k], continue
: A[5] == 'e' == 'e' == A[5-k], continue
: final k = 3,
: there are 3 unique rotated sequences

avatar
p*2
177

str+str 找到长度为n的match

【在 c***s 的大作中提到】
: 好像不对吧:
: 比如 ababa
: i = 1, k = 2
: i = 2, k = 2
: i = 3, k = 2
: i = 4, k = 2
: 但这里 k应该等于5

avatar
p*2
178

这题面到肯定跪了。

【在 l****i 的大作中提到】
: 看到大牛,服气了。
avatar
f*e
179
没有违反周期性啊。A[i-k]!=A[i]

【在 c***s 的大作中提到】
: 好像不对吧:
: 比如 ababa
: i = 1, k = 2
: i = 2, k = 2
: i = 3, k = 2
: i = 4, k = 2
: 但这里 k应该等于5

avatar
d*x
180
一般还是能想到 str+str 然后kmp或者hash的吧
利用周期性确实太巧妙了。

【在 p*****2 的大作中提到】
:
: 这题面到肯定跪了。

avatar
c*s
181
但这个周期是5吧。
难道我看错题目了?

【在 f*****e 的大作中提到】
: 没有违反周期性啊。A[i-k]!=A[i]
avatar
p*9
182
相当于找这个字符串的最小循环节的长度,求出kmp算法的next数组,假设字符串长度
为N,最小循环节的长度是 N - next[N] 同时要求 N % (N - next[N]) == 0
avatar
l*i
183
storm8刚给我发了online test的link.......

【在 p*****2 的大作中提到】
:
: 这题面到肯定跪了。

avatar
c*t
184
还真有点问题
ababa+ababa

【在 p*****2 的大作中提到】
:
: 这题面到肯定跪了。

avatar
l*i
185
byeby,这个K最后也是3?
但是按照题目,这个应该输出5吧.
byeby
yebyb
ebyby
bybye
ybyeb

【在 f*****e 的大作中提到】
: update k=n+1是对的,数学证明真的很tricky。
: A=byebye
: A[0] == 'b', k = 1;
: A[1] == 'y' != 'b' == A[1-k], update k = 2;
: A[2] == 'e' != 'b' == A[2-k], update k = 3;
: A[3] == 'b' == 'b' == A[3-k], continue
: A[4] == 'y' == 'y' == A[4-k], continue
: A[5] == 'e' == 'e' == A[5-k], continue
: final k = 3,
: there are 3 unique rotated sequences

avatar
f*e
186
还真是,想想再怎么改改。

【在 l****i 的大作中提到】
: byeby,这个K最后也是3?
: 但是按照题目,这个应该输出5吧.
: byeby
: yebyb
: ebyby
: bybye
: ybyeb

avatar
f*e
187
延长之后继续求周期也可以,只要周期不大于长度就行。复杂度还是O(N),未经
验证,慎用:-)
byebybyeby
35
stop

【在 f*****e 的大作中提到】
: 还真是,想想再怎么改改。
avatar
e*s
188
二爷,能过

【在 p*****2 的大作中提到】
:
: 这题面到肯定跪了。

avatar
e*i
189
擦,真心跪了,我找了HR要了test的结果,各位大牛看看吧,貌似我题目理解错了?
extreme_single_letter
single letter
0.25 s. WRONG ANSWER got 0 expected 1
extreme_a5
a*5
0.24 s. WRONG ANSWER got 0 expected 5
medium1
ab*1000
0.31 s. WRONG ANSWER got 1 expected 1000
好可惜。。这个教训好深刻
avatar
l*i
190
没看懂...是哪3个test cases?

【在 e******i 的大作中提到】
: 擦,真心跪了,我找了HR要了test的结果,各位大牛看看吧,貌似我题目理解错了?
: extreme_single_letter
: single letter
: 0.25 s. WRONG ANSWER got 0 expected 1
: extreme_a5
: a*5
: 0.24 s. WRONG ANSWER got 0 expected 5
: medium1
: ab*1000
: 0.31 s. WRONG ANSWER got 1 expected 1000

avatar
l*5
191
。。。所以是求最小周期的重复次数?学名叫什么来着。 。。。。

【在 e******i 的大作中提到】
: 擦,真心跪了,我找了HR要了test的结果,各位大牛看看吧,貌似我题目理解错了?
: extreme_single_letter
: single letter
: 0.25 s. WRONG ANSWER got 0 expected 1
: extreme_a5
: a*5
: 0.24 s. WRONG ANSWER got 0 expected 5
: medium1
: ab*1000
: 0.31 s. WRONG ANSWER got 1 expected 1000

avatar
s*y
192
3个test case是啥?
avatar
l*5
193
single letter
a*5
ab*1000

【在 s***y 的大作中提到】
: 3个test case是啥?
avatar
e*s
194
ab*1000 expect 1000?
avatar
p*2
195

能想到。不过online test不好写呀。hash那个,我不清楚怎么选mod。kmp我从来也没
写过。不知道能不能写对,通过test case呢。话说tc用到kmp的时候多不多呀?

【在 d**********x 的大作中提到】
: 一般还是能想到 str+str 然后kmp或者hash的吧
: 利用周期性确实太巧妙了。

avatar
p*2
196

不是一个题呀。

【在 e******i 的大作中提到】
: 擦,真心跪了,我找了HR要了test的结果,各位大牛看看吧,貌似我题目理解错了?
: extreme_single_letter
: single letter
: 0.25 s. WRONG ANSWER got 0 expected 1
: extreme_a5
: a*5
: 0.24 s. WRONG ANSWER got 0 expected 5
: medium1
: ab*1000
: 0.31 s. WRONG ANSWER got 1 expected 1000

avatar
p*2
197

这道题说了一定是O(n)吗?按照数据的规模,感觉nlogn应该能过呀。

【在 e******i 的大作中提到】
: 擦,真心跪了,我找了HR要了test的结果,各位大牛看看吧,貌似我题目理解错了?
: extreme_single_letter
: single letter
: 0.25 s. WRONG ANSWER got 0 expected 1
: extreme_a5
: a*5
: 0.24 s. WRONG ANSWER got 0 expected 5
: medium1
: ab*1000
: 0.31 s. WRONG ANSWER got 1 expected 1000

avatar
p*2
198

多谢大牛。有时间得练练kmp了。看了一下感觉还挺麻烦的。

【在 m******s 的大作中提到】
: 好像最近只见过一道用kmp来dp的。。。srm 557 div 2 1000
avatar
w*p
199


【在 H****s 的大作中提到】
: 这个题目 先将string 复制级联然后每次shift一位判断是否相等
: 如 "codility" --> "codilitycodility" 然后再跟原string 判断就行了!

avatar
x*y
200
不重复的单词个数是 最小周期数。
然后每个不重复单词出现的次数是一样的。根据这两个推论,可以直接append
original str, 然后kmp查找最先出现的次数找到最小周期
avatar
H*s
201
对, 除非用rolling hash 或 KMP 否则就是O(N^2). 上个班的功夫怎么就这么多回帖
啦,慢慢看吧。

【在 p*****2 的大作中提到】
:
: 多谢大牛。有时间得练练kmp了。看了一下感觉还挺麻烦的。

avatar
e*i
202

说了,我看了大case,我还是超时了几十毫秒的样子

【在 p*****2 的大作中提到】
:
: 多谢大牛。有时间得练练kmp了。看了一下感觉还挺麻烦的。

avatar
e*i
203


【在 H****s 的大作中提到】
: 对, 除非用rolling hash 或 KMP 否则就是O(N^2). 上个班的功夫怎么就这么多回帖
: 啦,慢慢看吧。

avatar
p*2
204

要求是多少?2秒?你是用O(n)的解做的吗?

【在 e******i 的大作中提到】

avatar
e*i
205

要求是1.04,我做了1.6.。。。sigh,总之是做错了

【在 p*****2 的大作中提到】
:
: 要求是多少?2秒?你是用O(n)的解做的吗?

avatar
g*y
206
为啥ab×1000是1000?不应该是2吗?

【在 e******i 的大作中提到】
:
: 要求是1.04,我做了1.6.。。。sigh,总之是做错了

avatar
p*2
207

how about "aabaaaba"?
aabaaabaaabaaaba
abaaabaaabaaabaa
baaabaaabaaabaaa
aaabaaabaaabaaab
aabaaabaaabaaaba

【在 e***s 的大作中提到】
: 二爷,能过
avatar
p*2
208

你的复杂度是多少?

【在 e******i 的大作中提到】
:
: 要求是1.04,我做了1.6.。。。sigh,总之是做错了

avatar
c*t
209
这样行不?
public int count2(char[] str) {
int n = str.length, count = 1;
for (int i = 1; i < n;i++) {
if (str[i] != str[i-count]) {
count = i+1;
}
}
return count>n/2? n/2: count;
}

【在 f*****e 的大作中提到】
: 还真是,想想再怎么改改。
avatar
c*t
210
看看的改进版,在楼上。

【在 p*****2 的大作中提到】
:
: 你的复杂度是多少?

avatar
p*2
211

你的改进版的计算结果是多少?

【在 c********t 的大作中提到】
: 看看的改进版,在楼上。
avatar
c*t
212
嗯,还是不行,看来每个字母都要从头比较,还是要N^2算法才行。
KMP感觉在这道题不好用。

【在 p*****2 的大作中提到】
:
: 你的改进版的计算结果是多少?

avatar
c*t
213
现在看来,这个解法似乎最优。不过应该是所有factor,而不是所有prime factor吧。
all factor of a num 似乎是个sqrt(n)数量级。

1

【在 b*****6 的大作中提到】
: 前些天我也看到这个题,顺手写了一下:思路是找到s.length()的所有prime factor,
: 然后看根据这个factor移位是不是满足题的条件,如果是,结果加length/factor - 1
: public static int cyclic(String s)
: {
: int len = s.length();
:
: if (len <= 1)
: return 1;
:
: int result = 1;

avatar
c*t
214
嗯,就是你这个算法,O(n*sqrt(n)),改了改ben5736的codes 不知过不过的了大case;
public static int cyclic(String s) {
int len = s.length();
if (len <= 1)
return 1;
ArrayList factors = get_factors(len);
for (int i = factors.size() - 1; i >= 0; i--) {
int fctr = factors.get(i);
if (valid_cyclic(s, fctr))
return fctr;
}
return len;
}
static boolean valid_cyclic(String s, int v) {
for (int i = 0, j = v; i < s.length(); i++, j++) {
if (j == s.length())
j = 0;
if (s.charAt(i) != s.charAt(j))
return false;
}
return true;
}
static ArrayList get_factors(int val) {
ArrayList result = new ArrayList();
result.add(1);
int cur = 2;
do {
if (val % cur == 0) {
result.add(cur);
}
cur++;
} while (cur <= val / 2);
return result;
}

【在 m*****1 的大作中提到】
: 我当时做这个test的方法跟你差不多,这样做过不了他的extreme large dataset的测
: 试,显示超时,然后我就跪了,后来我想到一个方法,不知道可行不可行,就是要组成
: 这个所谓的词组,必定是有特定substring重复出现,比如byebye是bye的重复两次,这
: 样,我想可不可以只找到当前string的长度,然后找到所有约数,也就是说约数长度的
: substring重复n次才能构成当前string,比如abcdefgabcdefg,当前长度是14,重复
: substring长度是7,这样,我们检查长度为2,7的substring就行了。这样快了很多

avatar
h*p
215
mark
avatar
s*s
216
根据楼上的某个版本写的 大概1秒可以run ~1,000,000 长度的输入
import sys
def prime_factors(n):
pf={}
prime = 2
while n>=prime:
if n%prime == 0:
pf[prime] = 1
n = n/prime
while n%prime==0:
n = n/prime
pf[prime] = pf[prime]+1
prime = prime + 1
return pf
def main(s):
n = len(s)
sl = set(s)
if n <= 1 or n==len(sl):
return 1
pf = prime_factors(n)
print(pf)
multiplier = 1
for factor in pf:
while pf[factor]>0:
divide = 1
for i in range(factor-1):
if s[int(i*n/factor):int((i+1)*n/factor)] != s[int((i+1)*n/factor):
int((i+2)*n/factor)]:
divide = 0
if divide == 1:
multiplier = multiplier*factor
s = s[0:int(n/factor)]
n = n/factor
pf[factor] = pf[factor]-1
else:
pf[factor]=0
return multiplier
t0 = time.clock()
main(s)
print(str(time.clock()-t0))
if __name__ == '__main__':
output = main(sys.argv[1])
print(output)
相关阅读
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。