After observing the results of Spy Syndrome, Yash realised the errors of his ways. He now believes that a super spy such as Siddhant can't use a cipher as basic and ancient as Caesar cipher. After many weeks of observation of Siddhant’s sentences, Yash determined a new cipher technique.
For a given sentence, the cipher is processed as:
- Convert all letters of the sentence to lowercase.
- Reverse each of the words of the sentence individually.
- Remove all the spaces in the sentence.
For example, when this cipher is applied to the sentence
Kira is childish and he hates losing
the resulting string is
ariksihsidlihcdnaehsetahgnisol
Now Yash is given some ciphered string and a list of words. Help him to find out any original sentence composed using only words from the list. Note, that any of the given words could be used in the sentence multiple times.
The first line of the input contains a single integer n (1 ≤ n ≤ 10 000) — the length of the ciphered text. The second line consists of nlowercase English letters — the ciphered text t.
The third line contains a single integer m (1 ≤ m ≤ 100 000) — the number of words which will be considered while deciphering the text. Each of the next m lines contains a non-empty word wi (|wi| ≤ 1 000) consisting of uppercase and lowercase English letters only. It's guaranteed that the total length of all words doesn't exceed 1 000 000.
Print one line — the original sentence. It is guaranteed that at least one solution exists. If there are multiple solutions, you may output any of those.
30 ariksihsidlihcdnaehsetahgnisol 10 Kira hates is he losing death childish L and Note
Kira is childish and he hates losing
12 iherehtolleh 5 HI Ho there HeLLo hello
HI there HeLLo
In sample case 2 there may be multiple accepted outputs, "HI there HeLLo" and "HI there hello" you may output any of them.
题目链接:点击打开链接
给出一个字符串, 还原这个字符串为原句, 将此字符串拆分为一个个的单词, 如果与下面给出的m个单词相匹配, 则该单词为原句单词, 要
求原字符串全部匹配.
由于给出的字符串是逆置后的, 所以对读入的m个字符串进行逆置, 且将大写转化为小写, 而后进行dfs, 每次dfs时得到子串与处理后的m
个字符串进行匹配, 如果匹配成功, 就保存到ans中, 直到长度刚好为原长, 那么得到了答案.
AC代码:
#include "iostream"
#include "cstdio"
#include "cstring"
#include "algorithm"
#include "queue"
#include "stack"
#include "cmath"
#include "utility"
#include "map"
#include "set"
#include "vector"
#include "list"
#include "string"
#include "cstdlib"
using namespace std;
typedef long long ll;
#define X first
#define Y second
const int MOD = 1e9 + 7;
const int INF = 0x3f3f3f3f;
const int MAXN = 1e5 + 5;
int n, m;
string text, ans, ori[MAXN], aft[MAXN];
bool flag;
void Dfs(int cnt, string ans)
{
if(cnt == n) {
cout << ans;
flag = true;
return;
}
string tmp;
for(int i = 0; i < m && !flag; ++i) {
tmp = text.substr(cnt, aft[i].size());
if(tmp == aft[i]) Dfs(cnt + aft[i].size(), ans + ori[i] + " ");
}
}
int main(int argc, char const *argv[])
{
scanf("%d", &n);
cin >> text;
scanf("%d", &m);
for(int i = 0; i < m; ++i) {
cin >> ori[i];
aft[i] = ori[i];
transform(aft[i].begin(), aft[i].end(), aft[i].begin(), ::tolower);
reverse(aft[i].begin(), aft[i].end());
}
Dfs(0, ans);
return 0;
}