当前位置 博文首页 > ApocalypseTq的博客:P1037 [NOIP2002 普及组] 产生数 题解

    ApocalypseTq的博客:P1037 [NOIP2002 普及组] 产生数 题解

    作者:[db:作者] 时间:2021-09-23 15:39

    此题正解为DFS(n扩大到10^100000也不会超时)

    原因:

    Floyd的时间复杂度为O(n^3),此处n为10(表示0-9每个数字)

    DFS的理论时间复杂度为指数级,即O(2^k),但本题中每个数字只搜索一次,重复的直接return,因此每一位实际的时间复杂度仅为O(n)

    本题中注意整数n要用字符串读入,用long long会爆,用int128

    代码

    #include<bits/stdc++.h>
    #define lll __uint128_t
    using namespace std;
    char a[39],k,x[19],y[19];
    bool b[99];
    int l,t;
    lll s;
    void out(lll x){//int128输出要自己写
    	if(x>9)out(x/10);
    	putchar(x%10+48);
    }
    void dfs(char c){
    	if(b[c])return;//重复就退出
    	b[c]=1;
    	for(int i=0;i<k;i++)if(x[i]==c)dfs(y[i]);
    }
    int main(){
    	scanf("%s%d",a,&k),l=strlen(a);
    	for(int i=0;i<k;i++)cin>>x[i]>>y[i];
    	dfs(a[0]),b[0]=0;//先搜索最高位,因为最高位不能为0
    	for(char i='1';i<='9';i++)t+=b[i],b[i]=0;
    	s=t,t=0;
    	for(int i=1;i<l;i++){//搜索其余位
    		dfs(a[i]);
    		for(char i='0';i<='9';i++)t+=b[i],b[i]=0;
    		s*=t,t=0;
    	}
    	out(s);
    }
    cs