(ええと、私の英語はよくありません) :)
私の友人は現在 C++ を学んでいて、私が理由を説明できない問題を見つけました。
最初のコード、それは 2000MS 以上を実行します
#include <cstdlib>
#include <cstdio>
#include <cstring>
using namespace std;
int ans[2000000];
char a[2000000];
int main()
{
scanf("%s\n",a);
int l=1,r=strlen(a);
for (int i=0;i<strlen(a);i++)
if (a[i]=='l')
ans[r--] = i+1;
else
ans[l++] = i+1;
for (int i=1;i<=strlen(a);i++)
printf("%d\n",ans[i]);
return 0;
}
セカンドコード、それは465MSを実行します
#include <cstdlib>
#include <cstdio>
#include <cstring>
using namespace std;
int ans[2000000];
char a[2000000];
int size;
int main()
{
scanf("%s",a);
int l=1,r=strlen(a);
size = r;
for (int i=0;i<strlen(a);i++)
if (a[i]=='l') ans[r--]=i+1;else ans[l++]=i+1;
for (int i=1;i<=size;i++)
printf("%d\n",ans[i]);
return 0;
}
3番目のコードは、2000MS以上を実行します
#include <cstdlib>
#include <cstdio>
#include <cstring>
using namespace std;
int ans[2000000];
char a[2000000];
int size;
int main()
{
scanf("%s",a);
int l=1,r=strlen(a);
size = r;
for (int i=0;i<size;i++)
if (a[i]=='l') ans[r--]=i+1;else ans[l++]=i+1;
for (int i=1;i<=strlen(a);i++)
printf("%d\n",ans[i]);
return 0;
}
最後のコード、それは 515MS を実行します
#include <cstdlib>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <string>
using namespace std;
int ans[2000000];
string a;
int main()
{
cin >>a;
int l=1,r=a.size();
for (int i=0;i<a.size();i++)
if (a[i]=='l') ans[r--]=i+1;else ans[l++]=i+1;
for (int i=1;i<=a.size();i++)
printf("%d\n",ans[i]);
return 0;
}
入力文字列サイズが10^5の場合
ということで、理由は約2番目のforループです。
そして、私の質問は、なぜ「strlen」関数と for ループの出力によってコードが非常に遅くなるのかということです。