高达OO

时限:500ms 内存限制:10000K  总时限:2000ms

描述:

西历2312年,天人组织为了屏蔽独立治安维护部队「A-Laws」的监控,在托勒密号上首先应用了一套对舰船命令进行验证的系统。 每条托勒密号舰船命令是一个字符串。字符串格式由小写字母,'#'和'*'组成。其中'#'对应任意一个小写字母,'*'对应0个或者多个小写字母。 托勒密号上的命令有很多种格式,你的任务是指出一条命令(如this)与哪些命令格式(如#h*s或*s)相符合。

输入:

第一行输入包括两个整数N (0 < N ≤ 100000) 和M (0 < M ≤ 100),N表示命令格式的数目,M表示需要判断的舰船命令的数目。接下来的N行是命令格式,命令格式的ID分别为0到N-1。接下来的M行是舰船命令。

假设命令格式的长度不超过6,舰船命令的长度不超过20.

输出:

对每个舰船命令,按ID递增的顺序输出它对应的命令格式的ID。如果命令格式中没有与之匹配的,请输出“Not match”。

输入样例:

5 4
t*
#h*s
##e*
*s
#*e
this
the
an
is

输出样例:

013
024
Not match
3
#include #include #include using namespace std; int m, n; bool MatchString(const string &a, const string &b) { int m = a.size() + 1, n = b.size() + 1; int i, j, k; bool match[10][25], result; memset(match, 0x00, sizeof(match)); match[0][0] = true; for (i = 1; i < m; ++i) { if (a[i - 1] == '*') match[i][0] = match[i - 1][0]; else match[i][0] = false; } for (i = 1; i < m; ++i) { for (j = 1; j < n; ++j) { if (a[i - 1] == b[j - 1] || a[i - 1] == '#') match[i][j] = match[i - 1][j - 1]; else if (a[i - 1] == '*') { for (k = 0; k <= j; ++k) match[i][j] |= match[i - 1][k]; } } } result = match[m - 1][n - 1]; return result; } void PrintResult(vector count[]) { for (int i = 0; i < n; ++i) { if (!count[i].empty()) { for (vector::iterator it = count[i].begin(); it != count[i].end(); ++it) cout << *it; cout << endl; } else cout << "Not match" << endl; } } int main(int argc, char *argv[]) { int i, j; cin >> m >> n; string *command = new string[m]; string *str = new string[n]; vector *count = new vector[n]; for (i = 0; i < m; ++i) cin >> command[i]; for (i = 0; i < n; ++i) cin >> str[i]; for (i = 0; i < n; ++i) { for (j = 0; j < m; ++j) { if (MatchString(command[j], str[i])) count[i].push_back(j); } } PrintResult(count); delete []command; delete []str; delete []count; return 0; }

你可能感兴趣的:(ACM,string,command,iterator,delete,任务,oo)