





class Solution {
public:
    int returnChar(char c){
        switch(c){
            case 'A':
                return 0;            
            case 'C':
                return 1;              
            case 'G':
                return 2;     
            case 'T':
                return 3;         
        }
        return 0;
    }
    vector<string> findRepeatedDnaSequences(string s) {
        int n = s.length();
        vector<string> res;
        if(n<=10) return res;
        bitset<1<<20>S1;
        bitset<1<<20>S2;
        int val = 0;
        for(int i=0;i<10;++i)
            val = (val<<2)|returnChar(s[i]);
        S1.set(val);
        int mask = (1<<20)-1;
        for(int i=10;i<n;++i){
            val = ((val<<2)&mask)|returnChar(s[i]);
            if(S2[val])
                continue;
            if(S1[val]){
                res.push_back(s.substr(i-9,10));
                S2.set(val);
            }else{
                S1.set(val);
            }
        }     
        return res;
    }
};                










