传送门
解题思路
纯属为了想练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 }
啊啊啊,快上课了,赶紧跑回教室去啊啊啊