2012-03-29 21:50:49Morris
[ZJ][最小表示法][環同構判定][a442] Necklace Problem (NP)
內容 :
「題目總是唬人的,事實上並沒有那麼難」
給你兩個項鍊,這兩條項鍊上都有 n 顆珠子(用 0 ~ 9 表示之),請判定這兩條項鍊是否相同。
記住項鍊可翻面。
後文:自從上了大學,就不來 ZJ 了 ... 因此題目如有雷同,請通知下架。
輸入說明
:
有多筆測資,每組有兩個長度相同的字串來代表兩個項鍊。
0 < n < 10000
輸出說明
:
相同請輸出 same, 不同請輸出 difference
範例輸入 :
4263 6234 4263 4362
範例輸出 :
difference same
提示
:
頭跟尾要接起來,因為是項鍊。 用 gets 會有問題, scanf 則沒有問題 ...
出處
:
Morris
(管理:morris1028)
#include <stdio.h>
#include <string.h>
int MinExpSame(const char *A, const char *B, const int slen) {
int i = 0, j = 0, k = 0;
int x, y, tmp;
while(i < slen && j < slen && k < slen) {
x = i + k;
y = j + k;
if(x >= slen) x -= slen;
if(y >= slen) y -= slen;
if(A[x] == B[y]) {
k++;
if(k == slen) {
return 1;
}
} else if(A[x] < B[y]) {
i = i+k+1;
k = 0;
} else {
j = j+k+1;
k = 0;
}
}
return 0;
}
int main() {
char A[10001], B[10001], tmp;
int i, j;
while(scanf("%s %s", A, B) == 2) {
if(MinExpSame(A, B, strlen(A)) == 0) {
for(i = 0, j = strlen(A)-1; i < j; i++, j--)
tmp = B[i], B[i] = B[j], B[j] = tmp;
if(MinExpSame(A, B, strlen(A)) == 0)
puts("difference");
else
puts("same");
} else
puts("same");
}
return 0;
}
#include <stdio.h>
#include <string.h>
int MinExpSame(const char *A, const char *B, const int slen) {
int i = 0, j = 0, k = 0;
int x, y, tmp;
while(i < slen && j < slen && k < slen) {
x = i + k;
y = j + k;
if(x >= slen) x -= slen;
if(y >= slen) y -= slen;
if(A[x] == B[y]) {
k++;
if(k == slen) {
return 1;
}
} else if(A[x] < B[y]) {
i = i+k+1;
k = 0;
} else {
j = j+k+1;
k = 0;
}
}
return 0;
}
int main() {
char A[10001], B[10001], tmp;
int i, j;
while(scanf("%s %s", A, B) == 2) {
if(MinExpSame(A, B, strlen(A)) == 0) {
for(i = 0, j = strlen(A)-1; i < j; i++, j--)
tmp = B[i], B[i] = B[j], B[j] = tmp;
if(MinExpSame(A, B, strlen(A)) == 0)
puts("difference");
else
puts("same");
} else
puts("same");
}
return 0;
}
下一篇:[機率][問題] 檢驗策略?