RE只有20分,悬关

P3294 [SCOI2016] 背单词

```cpp #include <bits/stdc++.h> //#define int long long const int N = 5.1e5 + 5; using namespace std; #define writeln(x) write(x) , putchar(10) #define writesp(x) write(x) , putchar(32) inline int read(){ char ch = getchar(); int x = 0 , f = 0; while(!isdigit(ch) ){ f |= (ch == '-'); ch = getchar(); } while(isdigit(ch) ){ x = (x << 1) + (x << 3) + (ch ^ 48); ch = getchar(); } return (f ? -x : x); } inline void write(long long x){ if(x < 0)putchar('-') , x = -x; if(x / 10)write(x / 10); putchar(x % 10 ^ 48); } vector<int> G[N]; struct TRIE { int t[N][27] , e[N] , cnt = 0; void adds(char* a){ int len = strlen(a + 1) , lst = 0; int p = 0; for(int i = 1; i <= len; ++ i){ if(t[p][a[i] - 'a']){ p = t[p][a[i] - 'a']; } else { ++ cnt; p = t[p][a[i] - 'a'] = cnt; } if(e[p]) lst = p; } // G.adde(lst + 1 , p + 1 , 1); G[lst + 1].push_back(p + 1); e[p] = 1; } }tr; int n; char a[N]; int son[N] , siz[N]; void dfs(int u , int fa){ siz[u] = 1; for(int v : G[u]){ if(v == fa)continue; ++ son[u]; dfs(v , u); siz[u] += siz[v]; } } bool cmp(int x , int y){ if(siz[x] > siz[y]){ swap(siz[x] , siz[y]); return 0; } else { return 1; } } //void dfs2(int u , int fa){ // sort(G[u].begin() , G[u].end() , cmp); // for(int v : G[u]){ // if(v == fa)continue; // dfs2(v , u); // } //} long long ans = 0; void sol(int u , int fa , long long sum){ if(!G[u].empty())sort(G[u].begin() , G[u].end() , cmp); int x = 1; for(int v : G[u]){ if(v == fa)continue; ++ ans; ans += sum + son[u] - x; sol(v , u , sum + son[u] - x); ++ x; } } signed main(){ n = read(); for(int i = 1; i <= n; ++ i){ cin >> (a + 1); int len = strlen(a + 1); reverse(a + 1 , a + 1 + len); tr.adds(a); } dfs(1 , 0); // return 0; sol(1 , 0 , 0); write(ans); return 0; } ```
by NightDiver @ 2024-02-21 16:54:14


可以确定是sol()函数的问题,因为在sol之前return 0是WA
by NightDiver @ 2024-02-21 16:58:15


没事了,cmp函数写了个傻逼操作,把它交换了
by NightDiver @ 2024-02-21 17:01:58


|