栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

poj 3382 Deciphering

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

poj 3382 Deciphering

#include <stdio.h>#include <string.h>#include <string>#include <map>#include <algorithm>using namespace std;typedef long long LL;#define MAXN 5010#define MOD 1000000000000000001LLmap<string, int> mp;char str[MAXN], temp[MAXN];bool can[MAXN][13];LL dp[1010][13][13];int pre1[1010][13][13], pre2[1010][13][13];bool state[1010][13][13];int part[30][30], len[30];int arr[1010][30];void solve(int i, int j, int k) {if(pre1[i][j][k] != 0) {if(k == 0) {int nj = pre2[i][j][k];solve(pre1[i][j][k], nj, len[nj] - 1);}else solve(pre1[i][j][k], j, k - 1);putchar(' ');}for(int ii = pre1[i][j][k] + 1; ii <= i; ++ii) putchar(str[ii]);if(k == len[j] - 1) putchar('.');}int main() {int n, m, k, maxi = 0;scanf("%d%d%d", &n, &m, &k);for(int i = 0; i < n; ++i) {scanf("%s", str);string s(str);int l = strlen(str);maxi = max(l, maxi);mp[s] = i;int cnt;scanf("%d", &cnt);for(int j = 0; j < cnt; ++j) {int num;scanf("%d", &num);can[i][num - 1] = true;}}for(int i = 0; i < m; ++i) {scanf("%d", len + i);for(int j = 0; j < len[i]; ++j) {scanf("%d", ∂[i][j]);part[i][j]--;}}scanf("%s", str + 1);int l = strlen(str + 1);memset(arr, -1, sizeof(arr));for(int i = 1; i <= l; ++i)for(int j = i; j <= l && j - i + 1 <= maxi; ++j) {int pos = 0;for(int k = i; k <= j; ++k) temp[pos++] = str[k];temp[pos] = '';string t(temp);map<string, int>::iterator it = mp.find(t);if(it != mp.end()) arr[j][j - i + 1] = it->second;}for(int i = 1; i <= maxi && i <= l; ++i) {int v = arr[i][i];if(v != -1) {for(int j = 0; j < m; ++j)if(can[v][part[j][0]]) {dp[i][j][0]++;pre1[i][j][0] = 0;pre2[i][j][0] = -1;}}}for(int i = 1; i <= l; ++i)for(int j = 0; j < m; ++j)for(int k = 0; k < len[j]; ++k) {if(dp[i][j][k] || state[i][j][k]) {for(int h = i + 1; h <= l && h - i <= maxi; ++h) {int v = arr[h][h - i];if(v == -1) continue;if(k != len[j] - 1) {if(can[v][part[j][k + 1]]) {dp[h][j][k + 1] += dp[i][j][k];pre1[h][j][k + 1] = i;pre2[h][j][k + 1] = j;if(dp[h][j][k + 1] >= MOD) {state[h][j][k + 1] = true;dp[h][j][k + 1] -= MOD;}state[h][j][k + 1] |= state[i][j][k];}}else {for(int x = 0; x < m; ++x)if(can[v][part[x][0]]) {dp[h][x][0] += dp[i][j][k];pre1[h][x][0] = i;pre2[h][x][0] = j;if(dp[h][x][0] >= MOD) {dp[h][x][0] -= MOD;state[h][x][0] = true;}state[h][x][0] |= state[i][j][k];}}}}}LL res = 0;int pos;bool flag = false;for(int i = 0; i < m; ++i) {res += dp[l][i][len[i] - 1];if(res >= MOD) {flag = true;res -= MOD;}flag |= state[l][i][len[i] - 1];if(dp[l][i][len[i] - 1] != 0 || state[l][i][len[i] - 1]) pos = i;}if(flag) puts("TOO MANY");else printf("%lldn", res);if(res != 0 || flag)solve(l, pos, len[pos] - 1);return 0;}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/371502.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号