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有何区别