| ||||||||||
| 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 | |||||||||
此题很有内涵#include<cmath>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
using namespace std;
/* POJ 3188 */
const int N = 1024;
const int MOD = 10000007;
int n, m, k;
int dic[N][15];
int bestAns, ans[30];
int map[30], vis[MOD], tim = 0;
char in[1000000], *p = in;
inline int nextInt(void) {
int res = 0;
while (*p < '0' || *p > '9')p++;
while (*p >= '0'&&*p <= '9')
res = res * 10 + *p++ - '0';
return res;
}
inline void readString(int id) {
while (*p<'A' || *p>'Z')p++;
while (*p >= 'A'&&*p <= 'Z')
dic[id][++dic[id][0]] = *p++ - 'A';
}
inline void checkAns(void) {
int tmp = 0, cnt = 0; tim++;
for (int i = 1; i <= k; i++, tmp = 0) {
for (int j = 1; j <= dic[i][0]; j++) {
tmp = tmp * 31 + map[dic[i][j]];
if (tmp >= MOD)tmp %= MOD;
}
if (abs(vis[tmp]) != tim)cnt++, vis[tmp] = tim;
else if (vis[tmp] == tim)cnt--, vis[tmp] = -tim;
}
if (cnt > bestAns)
memcpy(ans, map, sizeof(ans)), bestAns = cnt;
}
inline void dfs(int x, int y) {
if (bestAns >= k)return;
if (y == n) {
for (int i = x; i < m; i++)map[i] = y;
checkAns();
}
else {
for (int i = x; m - i > n - y; i++)map[i] = y;
for (int i = m - n + y; i > x; i--)dfs(i, y + 1);
}
}
signed main(void) {
fread(p, 1, 1000000, stdin);
/* input */ {
n = nextInt();
m = nextInt();
k = nextInt();
for (int i = 1; i <= k; i++)
readString(i);
}
/* solve */ {
bestAns = 0; dfs(0, 1);
printf("%d\n", bestAns);
for (int i = 1, j = 0; i <= n; i++, puts(""))
while (j < m && ans[j] == i)putchar('A' + j++);
}
#ifndef ONLINE_JUDGE
system("pause");
#endif // !ONLINE_JUDGE
}
Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator