Submission #112644

#TimeUsernameProblemLanguageResultExecution timeMemory
112644MladenPSelling RNA Strands (JOI16_selling_rna)C++17
0 / 100
1570 ms207360 KiB
#include<bits/stdc++.h> #define STIZE(x) fprintf(stderr, "STIZE%d\n", x); #define PRINT(x) fprintf(stderr, "%s = %d\n", #x, x); #define NL(x) printf("%c", " \n"[(x)]); #define lld long long #define pii pair<int,int> #define pb push_back #define fi first #define se second #define mid (l+r)/2 #define endl '\n' #define all(a) begin(a),end(a) #define sz(a) int((a).size()) #define LINF 1000000000000000LL #define INF 1000000000 #define EPS 1e-9 #pragma GCC optimize("Ofast") #pragma GCC target("avx,avx2,fma") using namespace std; #define MAXL 2000001 #define MAXN 100010 #define MOD 29996224275833LL int trie[MAXL][4], siz[MAXL], idx[MAXL], nodes, timer, hshidx, key, f[300]; bool sorted[MAXL]; vector<int> gde[MAXL], inNode[MAXL]; unordered_map<int,int> cudo, celi; lld hsh[MAXN], hsh1[MAXN], st[MAXN]; string P, Q, S; inline void ubaci(int node, string &s, int idx, int len) { if(idx == len) return; int c = f[s[idx]]; if(trie[node][c] == 0) trie[node][c] = ++nodes; //gde[hsh[len-1-idx]].pb(node); inNode[node].pb(hsh[len-1-idx]); ubaci(trie[node][c], s, idx+1, len); } inline int DFS(int node) { idx[node] = ++timer; for(auto x : inNode[node]) gde[x].pb(idx[node]); for(int i = 0; i < 4; i++) if(trie[node][i]) siz[node] += DFS(trie[node][i]); return ++siz[node]; } inline void hashuj(string &s, lld hsh[], int lens) { memset(hsh, 0, sizeof(hsh)); hsh[0] = 0; for(int i = lens-1, ob = 0; i >= 0; i--, ob++) { hsh[ob] += st[ob]*(f[s[i]]+1); //hsh[ob+1] = 0; hsh[ob+1] = hsh[ob]; if(hsh[ob] >= MOD) hsh[ob] %= MOD; //hsh[ob+1] = hsh[ob]; if(i == 0) celi[hsh[ob]]++; if(cudo[hsh[ob]] == 0) cudo[hsh[ob]] = ++hshidx; hsh[ob] = cudo[hsh[ob]]; } } inline void hashuj1(string &s, lld hsh[], int lens) { memset(hsh, 0, sizeof(hsh)); hsh[0] = 0; for(int i = lens-1, ob = 0; i >= 0; i--, ob++) { hsh[ob] += st[ob]*(f[s[i]]+1); //hsh[ob+1] = 0; hsh[ob+1] = hsh[ob]; //PRINT(hsh[ob]); if(hsh[ob] >= MOD) hsh[ob] %= MOD; //hsh[ob+1] = hsh[ob]; } } inline int query(int node, string &s, int idxx, int len) { if(idxx == len) return node; int c = f[s[idxx]]; if(trie[node][c] == 0) return -1; return query(trie[node][c], s, idxx+1, len); } int main() { ios::sync_with_stdio(false);cin.tie(0);cout.tie(0); int N, M; cin >> N >> M; f['A'] = 0, f['G'] = 1, f['C'] = 2, f['U'] = 3, st[0] = 1; for(int i = 1; i < MAXN; i++) st[i] = (st[i-1]*5 >= MOD ? (st[i-1]*5)%MOD : st[i-1]*5); for(int i = 1; i <= N; i++) { cin >> S; int lenS = sz(S); hashuj(S, hsh, lenS); ubaci(0, S, 0, lenS); } DFS(0); for(int q = 0; q < M; q++) { int rez = 0; cin >> P >> Q; int lenQ = sz(Q), lenP = sz(P); hashuj1(Q, hsh, lenQ); key = cudo[hsh[lenQ-1]]; int koji = query(0, P, 0, lenP); if(key == 0 || koji == -1) { cout << 0 << endl; continue; } /*if(!sorted[key]) { for(int i = 0; i < sz(gde[key]); i++) gde[key][i] = idx[gde[key][i]]; sort(all(gde[key])); sorted[key] = 1; }*/ hashuj1(P, hsh1, lenP); for(int i = 0; i < lenQ; i++) { if(hsh[lenQ-1] - hsh[lenQ-2-i] == hsh1[i]*st[lenQ-i-1]) { lld cur = hsh1[lenP-1]*st[lenQ-i-1] + hsh[lenQ-2-i]; rez += celi[cur]; } } rez += upper_bound(all(gde[key]), idx[koji]+siz[koji]-1) - lower_bound(all(gde[key]), idx[koji]); cout << rez << endl; } return 0; }

Compilation message (stderr)

selling_rna.cpp: In function 'void ubaci(int, std::__cxx11::string&, int, int)':
selling_rna.cpp:31:21: warning: array subscript has type 'char' [-Wchar-subscripts]
     int c = f[s[idx]];
                     ^
selling_rna.cpp: In function 'void hashuj(std::__cxx11::string&, long long int*, int)':
selling_rna.cpp:44:30: warning: 'sizeof' on array function parameter 'hsh' will return size of 'long long int*' [-Wsizeof-array-argument]
     memset(hsh, 0, sizeof(hsh));
                              ^
selling_rna.cpp:43:39: note: declared here
 inline void hashuj(string &s, lld hsh[], int lens) {
                                       ^
selling_rna.cpp:44:26: warning: argument to 'sizeof' in 'void* memset(void*, int, size_t)' call is the same expression as the destination; did you mean to dereference it? [-Wsizeof-pointer-memaccess]
     memset(hsh, 0, sizeof(hsh));
                          ^
selling_rna.cpp:47:34: warning: array subscript has type 'char' [-Wchar-subscripts]
         hsh[ob] += st[ob]*(f[s[i]]+1);
                                  ^
selling_rna.cpp: In function 'void hashuj1(std::__cxx11::string&, long long int*, int)':
selling_rna.cpp:58:30: warning: 'sizeof' on array function parameter 'hsh' will return size of 'long long int*' [-Wsizeof-array-argument]
     memset(hsh, 0, sizeof(hsh));
                              ^
selling_rna.cpp:57:40: note: declared here
 inline void hashuj1(string &s, lld hsh[], int lens) {
                                        ^
selling_rna.cpp:58:26: warning: argument to 'sizeof' in 'void* memset(void*, int, size_t)' call is the same expression as the destination; did you mean to dereference it? [-Wsizeof-pointer-memaccess]
     memset(hsh, 0, sizeof(hsh));
                          ^
selling_rna.cpp:61:34: warning: array subscript has type 'char' [-Wchar-subscripts]
         hsh[ob] += st[ob]*(f[s[i]]+1);
                                  ^
selling_rna.cpp: In function 'int query(int, std::__cxx11::string&, int, int)':
selling_rna.cpp:71:22: warning: array subscript has type 'char' [-Wchar-subscripts]
     int c = f[s[idxx]];
                      ^
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...