제출 #696320

#제출 시각아이디문제언어결과실행 시간메모리
696320uyluluRima (COCI17_rima)C++14
126 / 140
324 ms116008 KiB
#include<bits/stdc++.h>
using namespace std;

// #define int long long
#define endl "\n"

const int N = 5e5,sz = 6e6;

struct vertex{
    int nxt[26],pa = -1;
    bool spec = false;
    vertex() {
        memset(nxt,-1,sizeof(nxt));
    }
};

vector<vertex> trie(1);

void add(string s) {
    int v = 0,lst;
    for(auto u : s) {
        int c = u - 'a';
        if(trie[v].nxt[c] == -1) {
            trie[v].nxt[c] = trie.size();
            trie.emplace_back();
        }
        lst = v;
        v = trie[v].nxt[c];
        // cout<<lst<<" "<<v<<" "<<u<<endl;
    } 
    trie[v].spec = true;
}

int dp[sz + 1],one[sz + 1];

inline void dfs(int s) {
    if(dp[s] != -1) return;

    one[s] = 0;
    dp[s] = 0;

    int sz = 0;
    for(int i = 0;i < 26;i++) {
        int u = trie[s].nxt[i];
        if(u != -1) {
            dfs(u);
        }

        if(u != -1 && trie[u].spec) {
            sz++;
        }
    }
    if(trie[s].spec) {
        one[s] += trie[s].spec;
        one[s] += sz;

        int len = 0;

        for(int i = 0;i < 26;i++) {
            int u = trie[s].nxt[i];

            if(u != -1) {
                len = max(len,one[u]);
            }
        }
        if(len > 0) {
            one[s] += (len - 1);
        }
    }

    int cnt = 0;

    vector<int> st;

    for(int i = 0;i < 26;i++) {
        int u = trie[s].nxt[i];

        if(u != - 1) {
            st.push_back(one[u]);
        }
    }
    sort(st.begin(),st.end(),greater<int>());

    int tru = 0;

    for(int i = 0;i < 2 && i < st.size();i++) {
        dp[s] += (st[i] - 1);
    }
    dp[s] += trie[s].spec;
    dp[s] += sz;
}

signed main() {
    ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);

    // freopen("in.txt","r",stdin);
    // freopen("out.txt","w",stdout);

    int n;
    cin>>n;
    for(int i = 1;i <= n;i++) {
        string tmp;
        cin>>tmp;

        reverse(tmp.begin(),tmp.end());
        
        add(tmp);
    }
    int len = trie.size();

    memset(dp,-1,sizeof(dp));
    memset(one,-1,sizeof(one));

    dfs(0);

    int kq = 0;
    for(int i = 1;i <= trie.size();i++) {
        kq = max(kq,dp[i]);
        kq = max(kq,one[i]);
    }
    cout<<kq<<endl;


}           

컴파일 시 표준 에러 (stderr) 메시지

rima.cpp: In function 'void add(std::string)':
rima.cpp:20:15: warning: variable 'lst' set but not used [-Wunused-but-set-variable]
   20 |     int v = 0,lst;
      |               ^~~
rima.cpp: In function 'void dfs(int)':
rima.cpp:86:30: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   86 |     for(int i = 0;i < 2 && i < st.size();i++) {
      |                            ~~^~~~~~~~~~~
rima.cpp:71:9: warning: unused variable 'cnt' [-Wunused-variable]
   71 |     int cnt = 0;
      |         ^~~
rima.cpp:84:9: warning: unused variable 'tru' [-Wunused-variable]
   84 |     int tru = 0;
      |         ^~~
rima.cpp: In function 'int main()':
rima.cpp:117:21: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<vertex>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  117 |     for(int i = 1;i <= trie.size();i++) {
      |                   ~~^~~~~~~~~~~~~~
rima.cpp:109:9: warning: unused variable 'len' [-Wunused-variable]
  109 |     int len = trie.size();
      |         ^~~
#Verdict Execution timeMemoryGrader output
Fetching results...