洛谷 P5149 会议座位(归并排序,trie树)

传送门


解题思路

纯属为了想练trie树

其实map更简单

注意答案开longlong,数组开5*maxn

AC代码

 1 #include<cstdio>
 2 #include<iostream>
 3 #include<cstring>
 4 #include<iomanip>
 5 #include<cmath>
 6 using namespace std;
 7 const int maxn=100005;
 8 int n,ch[5*maxn][105],num[5*maxn],cnt;
 9 long long ans;
10 string s,a[maxn],f[maxn];
11 void insert(string s,int numm){
12     int len=s.length();
13     int now=1;
14     for(int i=0;i<len;i++){
15         if(!ch[now][s[i]-'A']) ch[now][s[i]-'A']=++cnt;
16         now=ch[now][s[i]-'A'];
17     }
18     num[now]=numm;
19 }
20 int getnum(int i){
21     int len=a[i].length();
22     int now=1;
23     for(int j=0;j<len;j++){
24         now=ch[now][a[i][j]-'A'];
25     }
26     return num[now];
27 }
28 void divide(int l,int r){
29     if(l==r) return;
30     int mid=(l+r)/2;
31     divide(l,mid);
32     divide(mid+1,r);
33     int i=l,j=mid+1,k=l;
34     while(i<=mid&&j<=r){
35         if(getnum(i)>getnum(j)){
36             ans+=mid-i+1;
37             f[k++]=a[j++];
38         }else{
39             f[k++]=a[i++];
40         }
41     }
42     while(i<=mid) f[k++]=a[i++];
43     while(j<=r) f[k++]=a[j++];
44     for(int i=l;i<=r;i++) a[i]=f[i];
45 }
46 int main(){
47     cin>>n;
48     for(int i=1;i<=n;i++){
49         cin>>s;
50         insert(s,i);
51     }
52     for(int i=1;i<=n;i++) cin>>a[i];
53     divide(1,n);
54     cout<<ans;
55     return 0;
56 }

啊啊啊,快上课了,赶紧跑回教室去啊啊啊

posted @ 2021-01-04 14:32  尹昱钦  阅读(95)  评论(0编辑  收藏  举报