题目


答案
#include<iostream>
#include<algorithm>
#include<cstring>
#include<map>
using namespace std;
int main()
{
map<string,int> maps;
int a[100005],vis[100005];
memset(a,0,sizeof a);
memset(vis,0,sizeof vis);
int n,p,isfirst=1;
cin>>n>>p;
for(int i=0;i<n;i++)
{
string s="";
cin>>s;
int len=s.length();
int sum=0;
if(len==1) sum=s[0]-'A';
else if(len==2) sum=(s[0]-'A')*32+s[1]-'A';
else
for(int j=len-3;j<len;j++)
{
sum=sum*32+s[j]-'A';
}
a[i]=sum;
int index=a[i]%p,flag=0,k=1;
int tmp=index;
if(vis[tmp]&&maps[s]==0)
{
while(vis[tmp]&&maps[s]==0)
{
if(flag==0)
{
tmp=(index+k*k)%p;
flag=1;
}
else
{
tmp=(index-k*k+p)%p;
k++;
flag=0;
}
}
}
maps[s]=sum;
vis[tmp]=1;
if(isfirst) isfirst=0;
else cout<<" ";
cout<<tmp;
}
}
注意
- 注意,求sum时,每位的权重都是32的倍数,而非10的倍数(注意审题)
- 注意字符串长度为1和2的情况
- 注意重复字符串的处理(maps[s]==0)
&spm=1001.2101.3001.5002&articleId=115840177&d=1&t=3&u=54d80c47be12433f8f4ee0e69b0d492c)

被折叠的 条评论
为什么被折叠?



