https://www.luogu.com.cn/problem/T281294
有人帮忙解答一下吗?
我的代码已经写到这了:
#include<bits/stdc++.h>
using namespace std;
const int N=100005,base=131,mod=1000069;
int n,num,ans,col;
int fir[1000100],nxt[1000100],to[1000100],p[1000100],vis[N];
int s[N][20],t[N][20];
bool cmp(int u,int v){
if(strlen(s[u])!=strlen(t[v]))return 0;
for(int i=0;s[u][i];i++){
if(s[u][i]!=t[v][i]){
return 0;
}
}
return 1;
}
void HASH(char p[],int k){
int key=0;
for(int i=0;p[i];i++){
key=(key*base%mod+p[i])%mod;
num++;
to[num]=k;
nxt[num]=first[u];
}
}
int find(int u,int x){
for(int i=fir[u];i;i=nxt[i]){
if(cmp(to,x)){
return to[i];
}
}
return 0;
}
void dfs(int step){
if(!p[step])return;
if(vis[p[step]]==vis[step]){
ans++;
return ;
}
if(!vis[p[step]])return ;
vis[p[step]]=vis[step];
dfs(p[step]);
}
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%s%s",s[i],t[i]);
HASH(s[i],i);
}
/*下面不会了。。。*/
return 0;
}
这里是思路: 给文件名“编号”可以采用哈希。 在当前哈希表中查找当前文件名,找到则直接返回编号,否则将当前文件名加入哈希表,++num,当前文件名编号记为num。 由于文件名不超过200000,每个长度都不超过10,因此可以采用“单哈希+比对”的方式实现文件名的查找。时间和空间都完全可以承受
//完整思路可以找我要
//luogu私信 : xmc6666