2017-07-25 39 views
0
#include <stdio.h> 

#define MAX 1000000 

int dp[MAX]; 
int P[MAX], C[MAX], K[MAX], child[MAX][1000], index[MAX]; 
int mod = 1000000007; 

void dfs(int i) { 
    int j = 1; 
    while (j <= index[i]) { 
     dfs(child[i][j]); 
     if ((C[child[i][j]] == C[i]) && (K[i] - K[child[i][j]] == 1)) 
      dp[i] = (dp[i] % mod + dp[child[i][j]] % mod) % mod; 
     ++j; 
    } 
} 

int main() { 
    int T, N, X, i, j; 
    scanf("%d", &T); 
    while (T--) { 
     scanf("%d%d", &N, &X); 

     for (i = 0; i < N; ++i) 
      index[i] = 0; 

     for (i = 1; i < N; ++i) { 
      scanf("%d", &P[i]); 
      child[P[i]][++index[P[i]]] = i; 
     } 
     for (i = 0; i < N; ++i) 
      scanf("%d", &C[i]); 
     for (i = 0; i < N; ++i) { 
      scanf("%d", &K[i]); 
      if (K[i]) 
       dp[i] = 0; 
      else 
       dp[i] = 1; 
     } 
     dfs(0); 
     for (i = 0; i < N; ++i) 
      printf("%d\n", dp[i]); 
    } 
    return 0; 
} 

當我編譯上面的代碼中,我得到了以下錯誤:定位誤差

In function `dfs': 
(.text+0xa): relocation truncated to fit: R_X86_64_32S against symbol `index' defined in COMMON section in /tmp/cc0VMXET.o 
(.text+0x3b): relocation truncated to fit: R_X86_64_32S against symbol `index' defined in COMMON section in /tmp/cc0VMXET.o 
(.text+0x4f): relocation truncated to fit: R_X86_64_32S against symbol `C' defined in COMMON section in /tmp/cc0VMXET.o 
(.text+0x56): relocation truncated to fit: R_X86_64_32S against symbol `C' defined in COMMON section in /tmp/cc0VMXET.o 
(.text+0x60): relocation truncated to fit: R_X86_64_32S against symbol `K' defined in COMMON section in /tmp/cc0VMXET.o 
(.text+0x67): relocation truncated to fit: R_X86_64_32S against symbol `K' defined in COMMON section in /tmp/cc0VMXET.o 
(.text+0x74): relocation truncated to fit: R_X86_64_32S against symbol `dp' defined in COMMON section in /tmp/cc0VMXET.o 
(.text+0x84): relocation truncated to fit: R_X86_64_32S against symbol `dp' defined in COMMON section in /tmp/cc0VMXET.o 
(.text+0x97): relocation truncated to fit: R_X86_64_32S against symbol `dp' defined in COMMON section in /tmp/cc0VMXET.o 
In function `main': 
(.text.startup+0x6e): relocation truncated to fit: R_X86_64_32S against symbol `index' defined in COMMON section in /tmp/cc0VMXET.o 
(.text.startup+0xba): additional relocation overflows omitted from the output 
error: ld returned 1 exit status 

我知道這是什麼錯誤,它是如何發生的。我已經在stackoverflow中搜索它,但我不明白如何糾正它。有人可以告訴我如何糾正我的代碼?

+3

你怎麼編?什麼是論據?並在什麼平臺上?什麼編譯器? – bolov

+0

我認爲你已經違反了int變量的容量,mod' –

+0

@ Md.RezwanulHaque大概這個問題的答案是「沒有警告」,像往常一樣。 –

回答

3

您可能對程序中定義的全局變量的大小達到限制:單獨的2D陣列child的大小爲4000000000字節(40億字節)。

要麼減小這些全局變量的大小,要麼在開始時將它們從堆中分配到calloc()

試試這個版本,其中child從堆中分配:

#include <stdio.h> 
#include <stdlib.h> 

#define MAX 1000000 

int dp[MAX], P[MAX], C[MAX], K[MAX], index[MAX]; 
int (*child)[1000]; 
int mod = 1000000007; 

void dfs(int i) { 
    int j = 1; 
    while (j <= index[i]) { 
     dfs(child[i][j]); 
     if ((C[child[i][j]] == C[i]) && (K[i] - K[child[i][j]] == 1)) 
      dp[i] = (dp[i] % mod + dp[child[i][j]] % mod) % mod; 
     ++j; 
    } 
} 

int main(void) { 
    int T, N, X, i; 

    child = calloc(MAX, sizeof(*child)); 
    if (child == NULL) { 
     fprintf(stderr, "cannot allocate child array (%llu bytes)\n", 
       (unsigned long long)MAX * sizeof(*child)); 
     return 1; 
    } 

    scanf("%d", &T); 
    while (T--) { 
     scanf("%d%d", &N, &X); 

     for (i = 0; i < N; ++i) 
      index[i] = 0; 

     for (i = 1; i < N; ++i) { 
      scanf("%d", &P[i]); 
      child[P[i]][++index[P[i]]] = i; 
     } 
     for (i = 0; i < N; ++i) 
      scanf("%d", &C[i]); 
     for (i = 0; i < N; ++i) { 
      scanf("%d", &K[i]); 
      if (K[i]) 
       dp[i] = 0; 
      else 
       dp[i] = 1; 
     } 
     dfs(0); 
     for (i = 0; i < N; ++i) 
      printf("%d\n", dp[i]); 
    } 
    free(child); 
    return 0; 
} 

注:

  • 您也應該檢查是否從標準輸入讀取的值與分配的尺寸兼容( N <= MAXP[i] < 1000)。

  • 如果分配失敗,則可以減少MAX1000

  • dp[i] = (dp[i] % mod + dp[child[i][j]] % mod) % mod;可以簡化爲dp[i] = (dp[i] + dp[child[i][j]]) % mod;

+0

我試圖運行你的代碼。以前的問題已被正確地管理;謝謝你。但是,現在它給了NZEC這是segmentaion error.Please告訴我如何改正它。 –

+0

@ShanifAnsari:沒有測試數據很難說 – chqrlie