问题:
您将获得字符串S和N查询。每个查询由两个整数定义--Li和Pi。计算字符串S中恰好出现Pi次数(作为连续子串)的长度为Li的字符串数。
// 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;
}
如何克服我的问题超出时间限制?
答案 0 :(得分:1)
也许您可以查看this来计算给定字符串中任意子字符串的整数哈希值。
然后解决方案是:
计算长度为L
的所有子字符串的哈希值,并使用map
(或某些类似的数据结构)对它们进行计数,因为您可以使用整数哈希值来表示子字符串。
答案 1 :(得分:0)
当然你会得到时间限制,你的算法以O(n ^ 2)复杂度运行, 你在哪里进行大量的字符串比较。通过用scanf替换cin,你几乎没有任何改变。
通过简单的迭代,O(n)复杂度可以很容易地解决这个问题
输入一次字符串,并将所有子字符串存储为std::map<string, int>
容器中的键。