ABC353E 题解
xiaofu15191 · · 题解
首先对
对于一个字符串
二分找到第
现在
对于每一个
最后将
#include<iostream>
#include<string>
#include<algorithm>
#include<vector>
using namespace std;
int n;
string s[300010];
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cin>>n;
for(int i=1;i<=n;i++) cin>>s[i];
sort(s+1,s+n+1);
long long ans=0;
for(int i=1;i<n;i++)
{
int lastpos=n;
vector<int>pos;
for(int j=0;j<s[i].size();j++)
{
int l=i+1,r=lastpos;
lastpos=0;
while(l<=r)
{
int mid=(l+r)>>1;
if(s[mid][j]<=s[i][j])
{
l=mid+1;
if(s[mid][j]==s[i][j]) lastpos=max(lastpos,mid);
}
else r=mid-1;
}
if(lastpos==0) break;
pos.push_back(lastpos);
}
pos.push_back(i);
for(int j=0;j<pos.size()-1;j++) ans+=(pos[j]-pos[j+1])*(j+1);
}
printf("%lld\n",ans);
}