【悬关】萌新刚学SAM,2WA8RE求助
查看原帖
【悬关】萌新刚学SAM,2WA8RE求助
317008
青溪白石楼主2024/2/26 16:50
#include <cstring>
#include <iostream>
#include <map>
#include <stack>
#include <cstring>
using namespace std;
const int maxn = 1e6+10;
struct SAM{
    map<char, int> next[maxn];
    int last, cur;
    int len[maxn], link[maxn], cnt[maxn];
    void init(){
        next[0].clear();
        last = 0;
        cur = 0;
        len[0] = 0;
        link[0] = -1;
        memset(vis, 0, sizeof vis);
    }
    int newnode(){
        cur++;
        next[cur].clear();
        return cur;
    }
    void insert(char ch){
        int p = newnode();
        len[p] = len[last] + 1;
        cnt[p] = 1;
        int q = last;
        last = p;
        while(q != -1 && !next[q].count(ch)){
            next[q][ch] = p;
            q = link[q];
        }
        //next[last][ch] = p;
        if(q == -1){
            link[p] = 0;
            return;
        }
        int r = next[q][ch];
        if(len[r] == len[q] + 1){
            link[p] = r;
            return;
        }
        int nq = newnode();
        next[nq] = next[r];
    	link[nq] = link[r];
        len[nq] = len[q]+1; link[p] = link[r] = nq;
        while(q != -1 && next[q][ch] == r){
            next[q][ch] = nq;
            q = link[q];
        }
    }
    stack<int> S;
    bool vis[maxn];
    void toposort(int p){
        S.push(p);
        vis[p] = 1;
        for(char ch = 'a'; ch <= 'z'; ch++){
            if(next[p].count(ch) && !vis[next[p][ch]]){
                toposort(next[p][ch]);
            }
        }
    }
    int solve(){
        toposort(0);
        int n = S.size();
        while(!S.empty()){
            int s = S.top(); S.pop();
            if(s == 0) break;
            cnt[link[s]] += cnt[s];
        }
        int ans = 0;
        for(int i = 1; i <= cur; i++){
            if(cnt[i] <= 1) continue;
            ans = max(ans, cnt[i] * len[i]);
        }
        return ans;
    }
}sam;
char S[maxn];
int main(){
    cin >> S;
    int n = strlen(S);
    sam.init();
    for(int i = 0; i < n; i++){
        sam.insert(S[i]);
    }
    cout << sam.solve();
}
2024/2/26 16:50
加载中...