[ABC287E] Karuta 题解
[ABC287E] Karuta 题解
按字典序将字符串排序后,对于,
为什么?我们设三个字符串按字典序依次为
如果
根据字典序的判断方法,
如果
对于
具体实现时,
Code
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
#define N 500005
int n;
struct bind{int id;string s;}binds[N];
int ans[N];
signed main()
{
ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
cin>>n;
for(int i=1;i<=n;++i)
cin>>binds[i].s,
binds[i].id=i;
sort(binds+1,binds+n+1,[](bind a,bind b){return a.s<b.s;});
for(int i=1;i<n;++i)
{
int l=0,r=min(binds[i].s.length(),binds[i+1].s.length());
while(l<r-1)
{
int mid=l+r>>1;
if(binds[i].s.substr(0,mid)==binds[i+1].s.substr(0,mid))
l=mid;
else r=mid-1;
}
int answer=binds[i].s.substr(0,r)==binds[i+1].s.substr(0,r)?r:l;
ans[binds[i].id]=max(ans[binds[i].id],answer);
ans[binds[i+1].id]=answer;
}
for(int i=1;i<=n;++i)
printf("%d\n",ans[i]);
return 0;
}