有漏洞吗??
查看原帖
有漏洞吗??
317568
AuKr楼主2020/8/10 13:43

不知道哪里错了,求助!

#include"iostream"
#include"cstdio"
#include"cmath"
#include"algorithm"
#include"cstring"
using namespace std;

#define read(x) scanf("%d",&x)
#define MAXN 10005
#define ll unsigned long long

int k;
int f[MAXN],vis[MAXN],l[30],be[30];
int a[MAXN],b[MAXN];
char s[MAXN];
int cnt=0,sum=0;
ll ans1=1,ans2=0,ans3=0;
int v[30],c=0;

void init(int n){for(int i=1;i<=n;i++) vis[i]=0,f[i]=i;}

int getf(int u){return f[u]=(f[u]==u)?u:getf(f[u]);}

void merge(int u,int v){int t1=getf(u),t2=getf(v);if(t1!=t2) f[t2]=t1;}

int tran(char c){return c-'a'+1;}

int main()
{
    read(k),be[1]=0;
    for(int i=1;i<=k;i++) read(l[i]),be[i+1]+=be[i]+l[i];
    scanf("%s",s);
    int lens=strlen(s);
    for(int i=0;i<lens;i++)
    {
        if(s[i]=='0') a[++cnt]=-1;
        else if(s[i]=='1') a[++cnt]=0;
        else
        {
            int op=tran(s[i]);
            for(int j=1;j<=l[op];j++) a[++cnt]=be[op]+j;
        }
    }
    cnt=0;
    scanf("%s",s);
    lens=strlen(s);
    for(int i=0;i<lens;i++)
    {
        if(s[i]=='0') b[++cnt]=-1;
        else if(s[i]=='1') b[++cnt]=0;
        else
        {
            int op=tran(s[i]);
            for(int j=1;j<=l[op];j++) b[++cnt]=be[op]+j;
        }
    }
    init(be[k]+l[k]);
    for(int i=1;i<=cnt;i++)
    {
        if((a[i]==0&&b[i]==-1)||(a[i]==-1&&b[i]==0)) return puts("0"),0;
        else if((a[i]>=-1&&a[i]<=0)||(b[i]>=-1&&b[i]<=0)) continue;
        merge(a[i],b[i]);
    }
    for(int i=1;i<=cnt;i++)
    {
        if(a[i]==0||a[i]==-1)
        {
            int now=getf(b[i]);
            vis[now]=1;
        }
        else if(b[i]==0||b[i]==-1)
        {
            int now=getf(a[i]);
            vis[now]=1;
        }
    }
    for(int i=1;i<=be[k]+l[k];i++) if(f[i]==i&&!vis[i]) sum++;
    for(int i=1;i<=sum;i++)
    {
        ans1=2ll*ans1,ans2=2ll*ans2,ans3=2ll*ans3;
        if(ans1>=1e15) ans1-=1e15,ans2+=1ll;
        if(ans2>=1e15) ans2-=1e15,ans3+=1ll;
    }
    if(ans3>=1)
    {
    	cout<<ans3;
    	for(int i=1;i<=14;i++)
        {
            ll rt=pow(10,i);
            v[++c]=(ans2%rt)/(rt/10);
        }
        for(int i=14;i>=1;i--) cout<<v[i];
        c=0;
        for(int i=1;i<=14;i++)
        {
            ll rt=pow(10,i);
            v[++c]=(ans1%rt)/(rt/10);
        }
        for(int i=14;i>=1;i--) cout<<v[i];
	}
    else if(ans2>=1)
    {
        cout<<ans2;
        for(int i=1;i<=14;i++)
        {
            ll rt=pow(10,i);
            v[++c]=(ans1%rt)/(rt/10);
        }
        for(int i=14;i>=1;i--) cout<<v[i];
    }
    else cout<<ans1;
    cout<<endl;
    return 0;
}
2020/8/10 13:43
加载中...