#include <bits/stdc++.h>
#define file(name) freopen(name".inp" , " r " , stdin);freopen(name".out" , " w " , stdout)
#define faster ios_base :: sync_with_stdio(false) ; cin.tie(0) ; cout.tie(0) ;
#define pii pair < int , int >
#define pdd pair < double , double >
#define fi first
#define se second
#define mii map< int , int>
#define mdd map< double , double >
#define qi queue < int >
#define dqi deque< int >
#define pf(x) push_front(x)
#define popf pop_front()
#define reset(a,val) memset(a ,val , sizeof(a) )
#define count_bit(i) __builtin_popcountll(i)
#define mask(i) ((1LL << (i)))
#define status(x, i) (((x) >> (i)) & 1)
#define set_on(x, i) ((x) | mask(i))
#define set_off(x, i) ((x) & ~mask(i))
#define endl '\n'
const int maxn = 1e6 + 6;
const int mod= 1e9 + 7;
const int INF= 1e9;
const int LOG = 20 ;
template <class T> inline T sqr(T x) { return x * x; };
template <class T> inline int Power(T x, int y)
{ if (!y) return 1; if (y & 1) return sqr(Power(x, y / 2)) % mod * x % mod; return sqr(Power(x, y / 2)) % mod; }
template<class T> bool minimize(T& a, const T& b) { return b < a ? a = b, 1 : 0; }
template<class T> bool maximize(T& a, const T& b) { return a < b ? a = b, 1 : 0; }
inline int gcd(int x, int y)
{ return y ? gcd(y , x % y) : x;}
inline int lcm(int x, int y) { return x * y / gcd(x, y); }
using namespace std;
int n , m;
string s[maxn];
int get_val(char ch)
{
return (ch == 'A' ? 1 : ch == 'G' ? 2 : ch == 'C' ? 3 : 4);
}
struct Trie{
struct Node{
Node* child[5];
int l , r;
int exits;
Node()
{
for (int i=1 ; i<=4 ; ++i) child[i] = NULL;
l = INF ; r = -INF;
}
};
Node* root;
Trie()
{
root = new Node();
};
void add(string s , int id)
{
Node* p = root;
for(int i=0 ; i<(int)s.size() ; ++i)
{
int c = get_val(s[i]);
if (p -> child[c] == NULL) p -> child[c] = new Node;
p = p -> child[c];
minimize(p -> l , id);
maximize(p -> r , id);
}
p -> exits++;
}
pii get_range(string s)
{
Node* p = root;
for (int i=0 ; i< (int)s.size() ; ++i)
{
int c = get_val(s[i]);
if (p->child[c] == NULL) return {-1 , -1};
p = p->child[c];
}
return {p->l , p->r};
}
};
struct RTrie{
struct Node{
Node* child[5];
vector<int> exits;
Node()
{
for (int i=1 ; i<=4 ; ++i) child[i] = NULL;
}
};
Node* root;
RTrie()
{
root = new Node;
};
void add(string s , int id)
{
Node* p = root;
for (int i=0 ; i<(int)s.size() ; ++i)
{
int c = get_val(s[i]);
if (p->child[c] == NULL) p->child[c] = new Node;
p = p->child[c];
p->exits.push_back(id);
}
}
int get_ans(string s , int u , int v)
{
Node* p = root;
for (int i=0 ; i< (int)s.size() ; ++i)
{
int c = get_val(s[i]);
if (p->child[c] == NULL) return 0;
p = p->child[c];
}
sort(p -> exits.begin() , p->exits.end());
// for (int x : p->exits) cout << x << " " ; cout << endl;
int l = lower_bound(p -> exits.begin() , p->exits.end() , u) - (p -> exits.begin());
int r = upper_bound(p -> exits.begin() , p->exits.end() , v) - (p -> exits.begin()) - 1;
return r - l + 1;
}
};
void solve()
{
cin >> n >> m ;
for (int i=1 ; i<=n ; ++i) cin >> s[i];
sort(s+1 , s+n+1);
Trie tr;
RTrie Rtr;
for (int i=1 ; i<=n ; ++i)
{
tr.add(s[i] , i);
reverse(s[i].begin() , s[i].end());
Rtr.add(s[i] , i);
}
while (m--)
{
string a , b ; cin >> a >> b;
pii it = tr.get_range(a);
// cout << it.fi << " " <<it.se << endl;
reverse(b.begin() , b.end());
if (it.fi == -1) cout << 0 << '\n';
else cout << Rtr.get_ans(b , it.fi , it.se) << '\n';
}
}
int32_t main()
{
faster;
solve();
return 0;
}
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
12 ms |
31576 KB |
Output is correct |
2 |
Correct |
13 ms |
31772 KB |
Output is correct |
3 |
Correct |
15 ms |
31680 KB |
Output is correct |
4 |
Correct |
12 ms |
31580 KB |
Output is correct |
5 |
Correct |
12 ms |
31580 KB |
Output is correct |
6 |
Correct |
12 ms |
31580 KB |
Output is correct |
7 |
Correct |
13 ms |
31888 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
197 ms |
253268 KB |
Output is correct |
2 |
Correct |
203 ms |
241800 KB |
Output is correct |
3 |
Correct |
187 ms |
170548 KB |
Output is correct |
4 |
Correct |
201 ms |
164180 KB |
Output is correct |
5 |
Correct |
169 ms |
244904 KB |
Output is correct |
6 |
Correct |
176 ms |
248148 KB |
Output is correct |
7 |
Correct |
112 ms |
47308 KB |
Output is correct |
8 |
Correct |
144 ms |
168260 KB |
Output is correct |
9 |
Correct |
125 ms |
148008 KB |
Output is correct |
10 |
Correct |
303 ms |
142672 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Execution timed out |
1567 ms |
32728 KB |
Time limit exceeded |
2 |
Halted |
0 ms |
0 KB |
- |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
12 ms |
31576 KB |
Output is correct |
2 |
Correct |
13 ms |
31772 KB |
Output is correct |
3 |
Correct |
15 ms |
31680 KB |
Output is correct |
4 |
Correct |
12 ms |
31580 KB |
Output is correct |
5 |
Correct |
12 ms |
31580 KB |
Output is correct |
6 |
Correct |
12 ms |
31580 KB |
Output is correct |
7 |
Correct |
13 ms |
31888 KB |
Output is correct |
8 |
Correct |
197 ms |
253268 KB |
Output is correct |
9 |
Correct |
203 ms |
241800 KB |
Output is correct |
10 |
Correct |
187 ms |
170548 KB |
Output is correct |
11 |
Correct |
201 ms |
164180 KB |
Output is correct |
12 |
Correct |
169 ms |
244904 KB |
Output is correct |
13 |
Correct |
176 ms |
248148 KB |
Output is correct |
14 |
Correct |
112 ms |
47308 KB |
Output is correct |
15 |
Correct |
144 ms |
168260 KB |
Output is correct |
16 |
Correct |
125 ms |
148008 KB |
Output is correct |
17 |
Correct |
303 ms |
142672 KB |
Output is correct |
18 |
Execution timed out |
1567 ms |
32728 KB |
Time limit exceeded |
19 |
Halted |
0 ms |
0 KB |
- |