题意:给定一篇文章,将每个单词的首尾字母不变,中间顺序打乱,然后将单词之间的空格去掉,得到一个序列,给出一个这样的序列,给你一个字典,将原文翻译出来。

析:在比赛的时候读错题了,忘记首尾字母不变了,一直WA。暴力求解,去深搜每个单词,做一些恰当的优化,能不进行的就不进行。胡搞的。

代码如下:

#pragma comment(linker, "/STACK:1024000000,1024000000")
#include <cstdio>
#include <string>
#include <cstdlib>
#include <cmath>
#include <iostream>
#include <cstring>
#include <set>
#include <queue>
#include <algorithm>
#include <vector>
#include <map>
#include <cctype>
#include <cmath>
#include <stack>
#include <unordered_map>
//#include <tr1/unordered_map>
#define freopenr freopen("in.txt", "r", stdin)
#define freopenw freopen("out.txt", "w", stdout)
using namespace std;
//using namespace std :: tr1; typedef long long LL;
typedef pair<int, int> P;
const int INF = 0x3f3f3f3f;
const double inf = 0x3f3f3f3f3f3f;
const LL LNF = 0x3f3f3f3f3f3f;
const double PI = acos(-1.0);
const double eps = 1e-8;
const int maxn = 1e4 + 5;
const LL mod = 10000000000007;
const int N = 1e6 + 5;
const int dr[] = {-1, 0, 1, 0, 1, 1, -1, -1};
const int dc[] = {0, 1, 0, -1, 1, -1, 1, -1};
const int hr[]= {-2, -2, -1, -1, 1, 1, 2, 2};
const int hc[]= {-1, 1, -2, 2, -2, 2, -1, 1};
const char *Hex[] = {"0000", "0001", "0010", "0011", "0100", "0101", "0110", "0111", "1000", "1001", "1010", "1011", "1100", "1101", "1110", "1111"};
inline LL gcd(LL a, LL b){ return b == 0 ? a : gcd(b, a%b); }
int n, m;
const int mon[] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
const int monn[] = {0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
inline int Min(int a, int b){ return a < b ? a : b; }
inline int Max(int a, int b){ return a > b ? a : b; }
inline LL Min(LL a, LL b){ return a < b ? a : b; }
inline LL Max(LL a, LL b){ return a > b ? a : b; }
inline bool is_in(int r, int c){
return r >= 0 && r < n && c >= 0 && c < m;
}
struct Node{
char s[105];
int id, n;
};
struct node{
string s;
char pre, last;
node(string ss, char p, char l) : s(ss), pre(p), last(l) { }
};
unordered_map<string, vector<Node> > mp;
bool vis[105];
vector<int> v;
vector<node> ans;
int cnt;
string str; int solve(const string &s, const string &ss){
int ans = 0;
for(int i = 0; i < mp[s].size(); ++i)
if(mp[s][i].s[0] == ss[0] && mp[s][i].s[mp[s][i].n-1] == ss[ss.size()-1]) ++ans;
return ans;
} bool dfs(int cur){
if(cur >= str.size()){ ++cnt; return true; }
if(cnt > 1) return true;
bool ok = false;
for(int i = 0; i < v.size() && v[i]+cur <= str.size(); ++i){
string s = str.substr(cur, v[i]);
if(s.size() > 2){
string ss = s.substr(1, s.size()-2);
sort(ss.begin(), ss.end());
if(!mp.count(ss)) continue;
int t = solve(ss, s);
if(!t) continue;
if(dfs(cur+v[i])){
if(t == 1){ ok = true; ans.push_back(node(ss, s[0], s[s.size()-1])); }
else { cnt = 5; return true; }
}
}
else{
if(!mp.count(s)) continue;
int t = 0;
for(int j = 0; j < mp[s].size(); ++j)
if(mp[s][j].n == s.size()) ++t;
if(!t) continue;
if(dfs(v[i]+cur)){
if(t == 1){ ok = true; ans.push_back(node(s, 0, s.size())); }
else { cnt = 5; return true; }
}
}
}
return ok;
} int main(){
int T; cin >> T;
while(T--){
cin >> str;
scanf("%d", &m);
mp.clear();
ans.clear();
v.clear();
memset(vis, false, sizeof vis);
char t[105];
Node u;
for(int i = 0; i < m; ++i){
scanf("%s", u.s);
int n = strlen(u.s);
u.n = n;
if(n > 2){
memcpy(t, u.s+1, n-2);
t[n-2] = 0;
sort(t, t+n-2);
u.id = mp[t].size();
mp[t].push_back(u);
}
else{
memcpy(t, u.s, n+1);
u.id = 0;
mp[t].push_back(u);
}
vis[n] = true;
}
for(int i = 1; i < 105; ++i) if(vis[i]) v.push_back(i);
cnt = 0; dfs(0);
if(cnt > 1) puts("ambiguous");
else if(!cnt) puts("impossible");
else {
for(int i = ans.size()-1; i >= 0; --i){
if(i != ans.size()-1) putchar(' ');
node &anss = ans[i];
for(int j = 0; j < mp[anss.s].size(); ++j){
if(anss.pre == 0 && mp[anss.s][j].n == anss.last){ printf("%s", mp[anss.s][j].s); break; }
else if(anss.pre == mp[anss.s][j].s[0] && anss.last == mp[anss.s][j].s[mp[anss.s][j].n-1]){
printf("%s", mp[anss.s][j].s); break;
}
}
}
printf("\n");
}
}
return 0;
}

HDU 2340 Obfuscation (暴力)的更多相关文章

  1. HDU 2340 Obfuscation(dp)

    题意:已知原串(长度为1~1000),它由多个单词组成,每个单词除了首尾字母,其余字母为乱序,且句子中无空格.给定n个互不相同的单词(1 <= n <= 10000),问是否能用这n个单词 ...

  2. HDU 5510 Bazinga 暴力匹配加剪枝

    Bazinga Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=5510 ...

  3. HDU 5522 Numbers 暴力

    Numbers Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=5522 ...

  4. hdu 5077 NAND(暴力打表)

    题目链接:hdu 5077 NAND 题目大意:Xiaoqiang要写一个编码程序,然后依据x1,x2,x3的值构造出8个字符.如今给定要求生成的8个字符.问 说Xiaoqiang最少要写多少行代码. ...

  5. hdu 5726 GCD 暴力倍增rmq

    GCD/center> 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5726 Description Give you a sequence ...

  6. hdu 4291(矩阵+暴力求循环节)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4291 思路:首先保留求出循环节,然后就是矩阵求幂了. #include<iostream> ...

  7. HDU 4462(暴力枚举)

    因为题目当中的k比较小k <= 10,所以可以直接枚举,题目里面由两个trick, 一个是如果每个点都可以放稻草人的话,那么答案是0, 另外一个就是如果可以放稻草人的点不用被照到.知道了这两个基 ...

  8. hdu 4499 Cannon(暴力)

    题目链接:hdu 4499 Cannon 题目大意:给出一个n*m的棋盘,上面已经存在了k个棋子,给出棋子的位置,然后求能够在这种棋盘上放多少个炮,要求后放置上去的炮相互之间不能攻击. 解题思路:枚举 ...

  9. hdu 4277 USACO ORZ (暴力+set容器判重)

    USACO ORZ Time Limit: 5000/1500 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total ...

随机推荐

  1. 最长递增子序列 (LIS) Longest Increasing Subsequence

    问题描述: 有一个长为n的数列a0, a1,..., an-1.请求出这个序列中最长的上升子序列.请求出这个序列中最长的上升子序列. 上升子序列:对于任意i<j都满足ai<aj的子序列. ...

  2. C++内存分配方式(——选自:C++内存管理技术内幕)

    C++内存分配的区: 1.栈:程序运行时分配的,局部变量,以及传入的参数等存储的地方,在程序结束的时候会回收 2.堆:new分配,由delete释放 3.自由存储区:malloc分配 4.全局/静态存 ...

  3. 转:Linux中的内存管理

    前一段时间看了<深入理解Linux内核>对其中的内存管理部分花了不少时间,但是还是有很多问题不是很清楚,最近又花了一些时间复习了一下,在这里记录下自己的理解和对Linux中内存管理的一些看 ...

  4. webpack体积优化篇一

    定位 webpack 大的原因   这里推荐使用 webpack-bundle-analyzer —— Webpack 插件和 CLI 实用程序,她可以将内容束展示为方便交互的直观树状图,让你明白你所 ...

  5. CSS 空中飘动的云动画

    <!doctype html> <html> <head> <meta charset="utf-8"> <title> ...

  6. python统一的换行符,实现跨平台

    6 PEP 278: Universal Newline Support The three major operating systems used today are Microsoft Wind ...

  7. Deepin-添加path

    以管理员权限添加path(Debian系列) sudo gedit /etc/profile 添加path路径格式是: export PATH=”$PATH:your path1:your path2 ...

  8. Codeforces Round #221 (Div. 2) D

    有点郁闷的题目,给了2000ms,可是n,m的范围已经是5000了.5000 * 5000一般在别的OJ已经是超了2000ms,一開始不敢敲.看了下别人有n*m的潜逃循环,原来CF的机子如此的强大,一 ...

  9. 迅雷CTO李金波:致创业者的一封信

    我的创业感悟:写给正在寻找机会的你 李金波 我在迅雷的6年里,经历了许多困难.最折磨人的,是寻找人才:最惋惜的,莫过于看着优秀的人擦肩而过.今天再次创业(http://myhada.com),再次招聘 ...

  10. HDU 1160 FatMouse&#39;s Speed(DP)

    题意  输入n个老鼠的体重和速度   从里面找出最长的序列  是的重量递增时速度递减 简单的DP  令d[i]表示以第i个老鼠为所求序列最后一个时序列的长度  对与每一个老鼠i  遍历全部老鼠j  当 ...