您的位置:首页 > 其它

Codeforces 514C Watto and Mechanism Trie树 + dfs

2015-02-25 22:44 375 查看
题目大意:

现在需要找的字符串S的T的关系为两者长度相同且刚好有1处字符不同

就是对于给定的n个字符串(n <= 3*10^5), 对于接下来输入的m次字符串询问(m <= 3*10^5), 每一次询问的字符串如果在给定的n个字符串中存在满足上述关系的串输出YES, 否则输出NO

大致思路:

就是将n个字符串插入Trie树暴搜一下就过了....

给出一点可能错的样例吧:

Input:

3 2

a

b

c

bb

a

b

Output:

NO

YES

YES

代码如下:

Result  :  Accepted     Memory  :  255196 KB     Time  :  358 ms

/*
* Author: Gatevin
* Created Time: 2015/2/25 13:24:49
* File Name: poi~.cpp
*/
#include<iostream>
#include<sstream>
#include<fstream>
#include<vector>
#include<list>
#include<deque>
#include<queue>
#include<stack>
#include<map>
#include<set>
#include<bitset>
#include<algorithm>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cctype>
#include<cmath>
#include<ctime>
#include<iomanip>
using namespace std;
const double eps(1e-8);
typedef long long lint;
int n, m, N;
char in[800000];
const int max_node = 20000000;//10000000 Runtime Error果断改20000000了...
bool flag;
struct Trie
{
int next[max_node][3];
bool end[max_node];
int L, root;
int newnode()
{
for(int i = 0; i < 3; i++)
next[L][i] = -1;
end[L++] = 0;
return L - 1;
}
void init()
{
L = 0;
root = newnode();
}
void insert(char *s)
{
int now = root;
for(; *s; s++)
{
if(next[now][*s - 'a'] == -1)
next[now][*s - 'a'] = newnode();
now = next[now][*s - 'a'];
}
end[now] = 1;
}
void dfs(int len, bool used, int now)
{
if(len == N && used && end[now]) flag = true;
if(flag) return;
if(len >= N) return;
if(used)
{
if(next[now][in[len] - 'a'] != -1)
dfs(len + 1, used, next[now][in[len] - 'a']);
}
else
{
for(int i = 0; i < 3; i++)
if(len + 1 == N && next[now][i] != -1 && i != in[len] - 'a' && end[next[now][i]])
flag = true;
for(int i = 0; i < 3; i++)
if(i != in[len] - 'a' && next[now][i] != -1)
dfs(len + 1, true, next[now][i]);
if(next[now][in[len] - 'a'] != -1)
dfs(len + 1, false, next[now][in[len] - 'a']);
}
}
};

Trie trie;

int main()
{
scanf("%d %d", &n, &m);
trie.init();
while(n--)
{
scanf("%s", in);
trie.insert(in);
}
while(m--)
{
scanf("%s", in);
N = strlen(in);
flag = false;
trie.dfs(0, false, 0);
if(flag) printf("YES\n");
else printf("NO\n");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息