题意
中文题:http://hihocoder.com/problemset/problem/1261
思路
- 建一个字典树,暴力dfs求解每个询问
- 注意的是,删除的处理和其它不同!
实现
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cstdio>
#include <vector>
#include <map>
#include <queue>
#include <stack>
#include <cstdlib>
#include <assert.h>
#include <string>
#include <set>
using namespace std;
#define fi first
#define se second
#define pb push_back
#define mp make_pair
typedef long long ll;
typedef pair<int,int> pii;
const int inf = 0x3f3f3f3f;
const double eps = 1e-8;
const int maxn = 200005;
const int maxm = 10004;
int n,m;
struct Node{
char ch;
int mark;
}node[maxn];
vector<int> g[maxn];
char str[maxn];
int num = 1;
vector<int> ans;
void add(int len,int id){
int now = 0;
for (int i=0;i<len;i++){
int flag = 0;
for (int j=0;j<g[now].size();j++){
if (node[g[now][j]].ch == str[i]){
flag = 1;
now = g[now][j];
break;
}
}
if (flag == 1)
continue;
node[num].ch = str[i];
node[num].mark = 0;
g[now].pb(num);
now = num;
num++;
}
node[now].mark = id;
}
void dfs1(int u,int dep,int mark){
if (dep == strlen(str) + 2){
if (node[u].mark != 0)
ans.pb(node[u].mark);
return;
}
for (int i=0;i<g[u].size();i++){
if (node[g[u][i]].ch != str[dep-mark]){
if (mark == 2){
continue;
}
else{
dfs1(g[u][i],dep+1,mark+1);
}
}
else{
dfs1(g[u][i],dep+1,mark);
}
}
}
void dfs2(int u,int dep,int mark){
if (dep == strlen(str)){
if (node[u].mark != 0)
ans.pb(node[u].mark);
return;
}
for (int i=0;i<g[u].size();i++){
if (node[g[u][i]].ch != str[dep]){
if (mark == 2){
continue;
}
else{
dfs2(g[u][i],dep+1,mark+1);
}
}
else{
dfs2(g[u][i],dep+1,mark);
}
}
}
void dfs3(int u,int dep,int mark){
if (dep == strlen(str) - 2){
if (node[u].mark != 0)
ans.pb(node[u].mark);
return;
}
for (int i=0;i<g[u].size();i++){
for (int j=mark;j<=2;j++){
if (node[g[u][i]].ch == str[dep+j]){
dfs3(g[u][i],dep+1,j);
break;
}
}
}
}
int main()
{
//freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
scanf("%d%d",&n,&m);
for (int i=0;i<n;i++){
scanf("%s",str);
add(strlen(str),i+1);
}
for (int i=0;i<m;i++){
memset(str,0,sizeof(str));
scanf("%s",str);
ans.clear();
dfs1(0,0,0);
sort(ans.begin(),ans.end());
for (int j=0;j<3;j++)
ans.pb(-1);
for (int j=0;j<3;j++){
if(j < 2)
printf("%d ",ans[j]);
else
printf("%d\n",ans[j]);
}
ans.clear();
dfs2(0,0,0);
sort(ans.begin(),ans.end());
for (int j=0;j<3;j++)
ans.pb(-1);
for (int j=0;j<3;j++){
if(j < 2)
printf("%d ",ans[j]);
else
printf("%d\n",ans[j]);
}
ans.clear();
dfs3(0,0,0);
sort(ans.begin(),ans.end());
for (int j=0;j<3;j++)
ans.pb(-1);
for (int j=0;j<3;j++){
if(j < 2)
printf("%d ",ans[j]);
else
printf("%d\n",ans[j]);
}
}
return 0;
}