Untitled

 avatar
Darin
plain_text
a year ago
1.8 kB
1
Indexable
Never
Đây là đoạn code của tôi, hãy trả lời câu hỏi mà tôi đặt ra:
 
 
class UserSolution {
    Map<String, Node> map = new HashMap<>();
    Set<Node> set = new HashSet<>();
 
 
    void init(int N) {
        map.clear();
        set.clear();
    }
 
 
    int generateString(int mTimestamp, int mLifespan, int mLen, char mStr[]) {
        Node newNode = new Node();
        newNode.cnt[mLen]++;
        newNode.endTime = mTimestamp + mLifespan;
        set.add(newNode);
 
 
        for (int i = 0; i < mLen - 2; i++) {
            String sub = "" + mStr[i] + mStr[i + 1] + mStr[i + 2];
            Node node = map.get(sub);
            if (node != null) {
                node = node.getRoot();
                node.update(mTimestamp);
                if (!node.isDeleted)
                    newNode.merge(node);
            }
            map.put(sub, newNode);
        }
        return checkString(mTimestamp, mLen);
    }
 
 
    int checkString(int mTimestamp, int mLen) {
        int cnt = 0;
        set.forEach(node -> node.update(mTimestamp));
        set.removeIf(node -> node.isDeleted);
        for (Node node : set)
            cnt += node.cnt[mLen];
        return cnt;
    }
}
 
 
class Node {
    int cnt[] = new int[11];
    int endTime;
    boolean isDeleted;
    Node parent;
 
 
    Node getRoot() {
        return parent == null ? this : parent.getRoot();
    }
 
 
    void update(int time) {
        if (endTime <= time)
            isDeleted = true;
    }
 
 
    void merge(Node node) {
        if (node != this) {
            node.isDeleted = true;
            node.parent = this;
            for (int i = 5; i <= 10; i++)
                cnt[i] += node.cnt[i];
        }
    }
}