时间限制超过了C ++

时间:2017-07-29 04:40:06

标签: c++

问题:

您将获得字符串S和N查询。每个查询由两个整数定义--Li和Pi。计算字符串S中恰好出现Pi次数(作为连续子串)的长度为Li的字符串数。

C++ code IDEONE

// COMMENT

int main()
{
    /*
    ######INPUT
    s = mynameispujanshahandmybrothersnameischintanshah
    1
    4 2

    ########OUTPUT
    name
    amei
    meis
    ansh
    nsha
    shah
    */
string s;
int q,l,p;
int counter =0;
cin>>s;
//cin>>q;
scanf("%d",&q);
for(int i=0;s[i]!='\0';i++)
   {
   counter++;
   }
while(q--)
{
    scanf("%d",&l);
scanf("%d",&p);
//cin>>l>>p;
int cnt =0;
//UNCOMMENT
string ss,ss1;

//above is initialization
for(int i=0;i<=counter-l;i++){
    //COMMENT
    ss=s.substr(i,l);
   // ss = mysubstr(s,i,l);
    int tot = 0;
    for(int j=0;j<=counter-l;j++){
      ss1 = s.substr(j,l);
      if(ss==ss1){
        if(j<i)
        {
            cout << ss1 << "\n";
           // printf("%s\n", ss1);

            break;
        }

        else
            tot++;
      }
    }
    if(tot==p)
        cnt++;
}

}
return 0;
}

如何克服我的问题超出时间限制?

2 个答案:

答案 0 :(得分:1)

也许您可以查看this来计算给定字符串中任意子字符串的整数哈希值。

然后解决方案是:

计算长度为L的所有子字符串的哈希值,并使用map(或某些类似的数据结构)对它们进行计数,因为您可以使用整数哈希值来表示子字符串。

答案 1 :(得分:0)

当然你会得到时间限制,你的算法以O(n ^ 2)复杂度运行, 你在哪里进行大量的字符串比较。通过用scanf替换cin,你几乎没有任何改变。

通过简单的迭代,O(n)复杂度可以很容易地解决这个问题 输入一次字符串,并将所有子字符串存储为std::map<string, int>容器中的键。