33,026
社区成员




def kmp_pattern(seq):
P = [0]*len(seq)
j = 0
for i in range(1, len(seq)):
while j > 0 and seq[j] != seq[i]:
j = P[j-1]
if seq[j] == seq[i]:
j += 1
P[i] = j
return P
def kmp_match(src, tmp, pat):
ret = []
j = 0
for i in range(len(src)):
while j > 0 and tmp[j] != src[i]:
j = pat[j-1]
if tmp[j] == src[i]:
j += 1
if j == len(tmp):
ret.append(i-len(tmp)+1)
j = pat[j-1]
return ret
def kmp_mismatch_once(src, tmp, pat, i, j):
p_i, p_j = i, j
state = 0
s_len, t_len = len(src), len(tmp)
while i<len(src):
if j<t_len and state == 0:
if src[i] == tmp[j]:
j += 1
else:
state = 1
p_i, p_j = i, j
j += 1
elif j<t_len and state == 1:
if src[i] == tmp[j]:
j += 1
else:
#not match
i, j = p_i, p_j
while j>0 and tmp[j] != src[i]:
j = pat[j-1]
return i, j, i-j, False
if j == len(tmp):
ret = i - t_len + 1
if state == 0:
j = pat[j-1]
return i+1, j, ret, True
elif state == 1:
i, j = p_i, p_j
while j>0 and tmp[j] != src[i]:
j = pat[j-1]
return i, j, ret, True
i += 1
return i, j, 0, False
def kmp_one_mismatch(src, tmp, pat):
pre_i, pre_j, i, j = 0, 0, 0, 0
pre_idx = -1
idx, ret2 = 0, False
ret = []
while i<len(src):
i, j, idx, ret2 = kmp_mismatch_once(src, tmp, pat, i, j)
if pre_i == i and pre_j == j and idx == pre_idx: #repeat
i += 1
else:
pre_i, pre_j = i, j
pre_idx = idx
if ret2 == True:
ret.append(idx)
return ret
sys.stdin=open( 'input00.txt', 'r')
T = int(raw_input())
while T:
T -= 1
src = raw_input()
tmp = raw_input()
if T != 0:
emp = raw_input()
src = list(src)
tmp = list(tmp)
pat = kmp_pattern(tmp)
idces = kmp_one_mismatch(src, tmp, pat)
for v in idces:
print(v),
print('')
String.prototype.findSimilar = function (str, sym) {
var len = str.length, sym = sym || ",";
var reg = "(?=.?["+str+"]{"+[len-1]+"})[^"+sym+"]{"+len+"}(?="+sym+")";
return this.match(new RegExp(reg, "g"));
}
alert(s1.findSimilar(s2, symbol));//symbol为s1中分隔符,缺省为“,”