发生超时。 2s仅限

时间:2015-03-29 08:19:38

标签: c string

您将获得两个字符串X和Y,两个字符串长度相等,仅包含小写拉丁字符('a' - 'z')。字符串Y将按字典顺序大于或等于字符串X.您必须输​​出按字典顺序大于或等于字符串X且按字典顺序小于或等于字符串Y的字符串总数,长度与字符串X相同并包含只有小写拉丁字符('a' - 'z')。因为这样的字符串数量可能很大,所以输出你的答案模数为109 + 7。

#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>
unsigned long long l=1000000007;

unsigned long long p(int z){
unsigned long long s=1;
for(int k=1;k<=z;k++)
    s=(s*26)%l;
    return s;
}

int main() {

int n,i,j,k;
unsigned long long sum=0;
scanf("%d",&n);
char X[1000001];
char Y[1000001];
scanf(" %[^\t\n]s",X);
scanf(" %[^\t\n]s",Y);
for(i=0;i<n;i++){
    if(X[i]!=Y[i]){
        sum=p(n-i);
        for(j=i;j<n;j++){
            sum=(sum-p(n-j-1)*(X[j]-97)-p(n-j-1)*(122-Y[j])+100*l)%l;
        }
        break;
    }
}

printf("%llu",sum);
return 0;

}

为什么会发生超时以及如何使程序在大于2的输入下运行?

1 个答案:

答案 0 :(得分:1)

您遇到的问题是因为格式说明符为%[...],最后的s表示scanf会在输入中查找文字's' 。如果输入中没有's'scanf将会阻止,直到找到它为止。