CSES - E4590 2016 6 - Results
Submission details
Task:DNA sequence
Sender:omantere
Submission time:2016-10-22 15:44:49 +0300
Language:C++
Status:READY
Result:
Test results
testverdicttime
#10.54 sdetails

Compiler report

input/code.cpp: In function 'void calc_hashes(long long int)':
input/code.cpp:48:40: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for(ll i = 0; i < s.size() - len + 1; i++) {
                                        ^

Code

#include <bits/stdc++.h>

#define _ ios_base::sync_with_stdio(0);cin.tie();
#define ll long long
#define vi vector<ll>
#define pb push_back
#define pii pair<ll, ll>
#define vpii vector<pii>
#define vvi vector< vector<ll> >
#define si set<ll>
#define mi map<string, ll>

using namespace std;

ll pr = 101;
ll M = (1e9 + 9)*(1e9 + 7);
string s;
map< ll, si > hashes;

ll mod (ll a, ll b)
{
    ll ret = a % b;
    if(ret < 0)
        ret+=b;
    return ret;
}

ll has(string s, ll prev = 0, char p = 'a') {
    ll len = s.size();
    //cout << "hashing " << s << " with prev=" << prev << " and p=" << p << endl;
    if(prev > 0) {
        //cout << "got " << mod(pr*prev - (ll)pow(pr, len + 1)*p + pr*s[len-1], M) << endl;
        return mod(pr*prev - (ll)pow(pr, len + 1)*p + pr*s[len-1], M);
    } else {
        ll h = 0;
        for(ll i = 0; i < len; i++) {
            h += mod(s[len-1-i]*(ll)pow(pr, i+1), M);
        }
        //cout << "got " << mod(h, M) << endl;
        return mod(h, M);
    }
}

void calc_hashes(ll len) {
    //cout << "starting to hash hashes with len " << len << endl;
    ll prev = 0;
    ll p = 'a';
    for(ll i = 0; i < s.size() - len + 1; i++) {
        prev = has(s.substr(i, len), prev, p);
        hashes[len].insert(prev);
        p = s[i];
    }
    //cout << "done hashing" << endl;
}

int main() { _
    cin >> s;
    ll q;
    cin >> q;
    string t;
    string buf;
    for(ll i = 0; i < q; i++) {
        cin >> t;
        if(hashes[t.size()].size() == 0) {
            calc_hashes(t.size());
        }
        if(hashes[t.size()].count(has(t, 0)) == 1) buf += "YES\n";
        else buf += "NO\n";
    }

    cout << buf;

    return 0;
}

Test details

Test 1

Verdict:

input
ACGCGGGCTCCTAGCGTTAGCAGTTGAGTG...

correct output
YES
YES
NO
NO
YES
...

user output
YES
YES
NO
NO
YES
...