| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
和楼上的思路几乎一样,只是他的代码不怎么看的懂可能我是弱鸡,想不明白你们一来就搞字典树和DFS的人,O(100000 * 100 * 常数)的时间复杂度,不应该直接爆么?
贴一个超时的代码,再贴一个AC代码,完全是考的编程能力。
//超时的代码
#include <stdio.h>
#include <string.h>
#define MAXN 100000
char ps[MAXN][7];
int answers[MAXN + 1];
int match(char *p, char *s) {
int a = 0, b = 0, c, lenp = strlen(p), lens = strlen(s), ret = 0;
char tp[7] = {0}, ts[21] = {0};
while (a < lenp && b < lens) {
if (p[a] == '*') {
for (c = a + 1; c < lenp; ++c) {
tp[c - a - 1] = p[c];
}
for (c = b; c < lens; ++c) {
ts[c - b] = s[c];
}
for (c = b; c <= lens; ++c) {
ret |= match(tp, ts + c - b);
}
return ret;
} else if (p[a] == s[b] || p[a] == '?') {
a += 1, b += 1;
} else {
return 0;
}
}
while (a < lenp && p[a] == '*') {
a += 1;
}
return ret | (a == lenp && b == lens);
}
int main() {
int N, M, a, b;
char word[21];
scanf("%d%d", &N, &M);
for (a = 0; a < N; ++a) {
scanf("%s", ps + a);
}
for (a = 0; a < M; ++a) {
scanf("%s", word);
answers[0] = 0;
for (b = 0; b < N; ++b) {
if (match(ps[b], word)) {
answers[++answers[0]] = b;
}
}
if (!answers[0]) {
printf("Not match\n");
continue;
}
for (b = 1; b <= answers[0]; ++b) {
printf("%d", answers[b]);
putchar(b == answers[0] ? '\n' : ' ');
}
}
return 0;
}
//AC的代码
#include <stdio.h>
#include <string.h>
#define MAXN 100000
char ps[MAXN][8], word[22];
int answers[MAXN + 1];
int match(int idx, int idxp, int idxs) {
int a = idxp, b = idxs, ret = 0;
while (a <= ps[idx][0] && b <= word[0]) {
if (ps[idx][a] == '*') {
while (b <= word[0]) {
ret |= match(idx, a + 1, b);
b += 1;
}
ret |= match(idx, a + 1, b);
return ret;
} else if (ps[idx][a] == word[b] || ps[idx][a] == '?') {
a += 1, b += 1;
} else {
return 0;
}
}
while (a <= ps[idx][0] && ps[idx][a] == '*') {
a += 1;
}
return ret | (a == ps[idx][0] + 1 && b == word[0] + 1);
}
int main() {
int N, M, a, b, len;
scanf("%d%d", &N, &M);
for (a = 0; a < N; ++a) {
scanf("%s", ps[a]);
len = strlen(ps[a]);
for (b = len; b > 0; --b) {
ps[a][b] = ps[a][b - 1];
}
ps[a][0] = len;
}
for (a = 0; a < M; ++a) {
scanf("%s", word + 1);
word[0] = strlen(word + 1);
answers[0] = 0;
for (b = 0; b < N; ++b) {
if (match(b, 1, 1)) {
answers[++answers[0]] = b;
}
}
if (!answers[0]) {
printf("Not match\n");
continue;
}
for (b = 1; b <= answers[0]; ++b) {
printf("%d", answers[b]);
putchar(b == answers[0] ? '\n' : ' ');
}
}
return 0;
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator