算法小白企图使用双指针找逆序对
查看原帖
算法小白企图使用双指针找逆序对
1229738
CyansQwQ楼主2024/5/7 14:20

这里有一个算法小白请求帮助(不会归并排序和map,才学没多久,请佬们谅解)大概就是我用字典树得到映射的数字后使用双指针去找答案,样列也通过了,但是最后只有10分


#include<bits/stdc++.h>
using namespace std;
const int N=5e5+10;
int n,idx,x=1,son[N][100],cnt[N];
long long res;
vector<int>aft;
string str;
void insert(string &str)
{
	int p=0;
	for(int i=0;i<str.size();i++)
	{
		int j=str[i]-'A';
		if(!son[p][j])son[p][j]=++idx;
		p=son[p][j];
	}
	cnt[p]=x;
	x++;
}
int query(string &str)
{
	int p=0;
	for(int i=0;i<str.size();i++)
	{
		int j=str[i]-'A';
		if(!son[p][j])break;
		p=son[p][j];
	}
	return cnt[p];
}
int main()
{
	ios::sync_with_stdio(false);cin.tie(0),cout.tie(0);
	cin>>n;
	for(int i=1;i<=n;i++){cin>>str;insert(str);}
	for(int i=1;i<=n;i++){cin>>str;aft.push_back(query(str));}
	for(int i=0,j=0;i<aft.size(),j<aft.size();)
	{
	    while(aft[j]>=aft[i]&&j<aft.size())j++;
	    if(aft[j]<aft[i]&&j!=aft.size()){res+=j-i;i=j+1,j=i;}
	}
	cout<<res<<'\n';     
	return 0;
}
2024/5/7 14:20
加载中...