我想以特定方式从用户那里获取输入,例如以下方式:
L1 L2 L3 N
L1,L2,L3 是由空格分隔的字符串。 N是一个整数。我尝试使用 cin
但速度很慢。我需要快速获得输入。字符串 L2 也重复了 N 次。所以我必须存储 l1 + l2*N + l3
。我试过字符串,但它变得太慢了。我得了 TLE。
这是我存储它们的方式:
#include<bits/stdc++.h>
using namespace std;
int main (){
string l1,l2,l3;
int n;
cin>>l1>>l2>>l3>>n;
string r;
r.reserve(l1.size()+n * l2.size()+l3.size());
r += l1;
for (int i=0; i<n;i++)
r +=l2;
r += l3;
cout<<r<<endl;
return 0;
}
And then iterated it in 2 separate for loops with maximum 1000 iterations in each loop.
我怎样才能有效地存储它们?我知道 vector ,但我不擅长它们。因此,如果有人知道如何将它们存储在 vector 中的这个序列中,请帮助我。或者如果它们可以存储在字符数组中,那么该怎么做?
最佳答案
好的。因此,让我们从将实际读数与其他代码隔离开来开始:
struct foo {
std::string l1, l2, l3;
int n;
friend std::istream &operator>>(std::istream &is, foo &f) {
return is >> f.l1, >> f.l2 >> f.l3 >> n;
}
};
这样我们就可以将一个充满这些记录的文件读入一个 vector 中,像这样:
std::vector<foo> data { std::istream_iterator<foo>(infile), {} };
我猜(就其本身而言)不会成为瓶颈。如果确实有必要,可能有更快的方法来完成这项工作,但我怀疑是否真的需要它。
根据关于如何进行搜索的评论,我们可以在不将第二个字符串扩展到 n
的情况下进行搜索。出现 l2
.
搜索的是从字符串开头到最后(最右边)出现的某个其他字符的一个字符。
由于“结束”模式是单个字符,我们可以很容易地做到这一点,而无需扩展中间字符串 ( L2
)。逻辑基本上是:
if L3 contains end_pattern
total = count(L1) + count(L2) * n + count(L3.substr(0, pattern_pos))
else if L2 contains end_pattern
total = count(L1) + count(L2) * (n-1) + count(L2.substr(0, pattern_pos))
else if L1 contains end_pattern
total = count(L1.substr(0, pattern_pos))
else
total = 0; // pattern isn't present anywhere
至少如评论中所述,评论中描述的O(N2)算法似乎没有任何必要。
关于C++ - 以特定方式输入字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40004881/