zoukankan      html  css  js  c++  java
  • 洛谷 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 }

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

  • 相关阅读:
    visual studio notes
    使用.net创建activex控件
    在程序中打开/关闭monitor or lcd
    Memory Barrier in Compiler and CPU
    被动工作与主动工作
    排序算法总结
    经典计算机基础数据结构:二叉树
    微软的Challenge文化
    海量数据处理方法的分析
    数组
  • 原文地址:https://www.cnblogs.com/yinyuqin/p/14229673.html
Copyright © 2011-2022 走看看