tellmewhywhywhy
查看原帖
tellmewhywhywhy
86789
_WAlkingDead楼主2022/10/12 20:11

AC:

#include<iostream>
#include<cstdio>
#include<cstring>
#define int long long
using namespace std;
inline int read(){
    int x=0,f=1;
    char ch=getchar();
    while(ch<'0'||ch>'9'){
        if(ch=='-') f=-1;
        ch=getchar();
    }
    while(ch>='0'&&ch<='9'){
        x=(x<<1)+(x<<3)+(ch^48);
        ch=getchar();
    }
    return x*f;
}
const int N=100;
int a[N],k,top[N][N],num[N];
bool vis[N];
string n;
int sum,ans[N];
void dfs(int x,int y){
    vis[x]=true;
    if(vis[y]) return ;
    sum++;
    for(int i=1;i<=num[y];i++) dfs(y,top[y][i]);
}
void mul(){
    int mod=0;
    for(int i=30;i>=0;i--){
        ans[i]=ans[i]*sum+mod;
        mod=ans[i]/10;
        ans[i]%=10;
    }
}
signed main(){
    cin>>n>>k;
    int len=n.length();
    for(int i=0;i<len;i++) a[i+1]=n[i]-'0';
    for(int i=1;i<=k;i++){
        int x=read(),y=read();
        top[x][++num[x]]=y;
    }
    ans[30]=1;
    for(int i=1;i<=len;i++){
        sum=1;
        
        for(int j=1;j<=num[a[i]];j++) dfs(a[i],top[a[i]][j]);
        memset(vis,false,sizeof(vis));
        mul();
        // ans*=sum;
    }
    int i=0;
    for(;ans[i]==0;i++);
    for(;i<=30;i++) printf("%d",ans[i]);
    // printf("%lld\n",ans);
    return 0;
}

WA(样例5

#include<iostream>
#include<cstdio>
#include<cstring>
#define int long long
using namespace std;
inline int read(){
    int x=0,f=1;
    char ch=getchar();
    while(ch<'0'||ch>'9'){
        if(ch=='-') f=-1;
        ch=getchar();
    }
    while(ch>='0'&&ch<='9'){
        x=(x<<1)+(x<<3)+(ch^48);
        ch=getchar();
    }
    return x*f;
}
const int N=100;
int a[N],k,top[N][N],num[N];
bool vis[N];
string n;
int sum,ans[N];
void dfs(int x,int y){
    if(vis[y]) return ;
    vis[x]=true;
    sum++;
    for(int i=1;i<=num[y];i++) dfs(y,top[y][i]);
    vis[x]=false;
}
void mul(){
    int mod=0;
    for(int i=30;i>=0;i--){
        ans[i]=ans[i]*sum+mod;
        mod=ans[i]/10;
        ans[i]%=10;
    }
}
signed main(){
    cin>>n>>k;
    int len=n.length();
    for(int i=0;i<len;i++) a[i+1]=n[i]-'0';
    for(int i=1;i<=k;i++){
        int x=read(),y=read();
        top[x][++num[x]]=y;
    }
    ans[30]=1;
    for(int i=1;i<=len;i++){
        sum=1;
        for(int j=1;j<=num[a[i]];j++) dfs(a[i],top[a[i]][j]);
        // memset(vis,false,sizeof(vis));
        mul();
        // ans*=sum;
    }
    int i=0;
    for(;ans[i]==0;i++);
    for(;i<=30;i++) printf("%d",ans[i]);
    // printf("%lld\n",ans);
    return 0;
}

两段dfs有何区别

2022/10/12 20:11
加载中...