【发布时间】:2023-03-17 22:10:02
【问题描述】:
给定一个整数数组,找出x和y个数相同的连续子序列的总数。 例如数组 [1,2,1] 代表 x=1 和 y=2 ans = 2 为其两个子数组 [1,2] 和 [2,1]。 检查每个连续的子序列是 O(n^2),效率太低。有什么改进的想法吗?
这是我写的代码
int get_total(int* a,int x,int y,int n){
int result=0;
for(int i=0;i<n;i++){
int x_c=0,y_c=0;
for(int j=i;j<n;j++){
if(a[j]==x){
x_c++;
}
if(a[j]==y){
y_c++;
}
if(x_c==y_c){
result++;
}
}
}
return result;
}
int main(){
int n,q;
cin >>n >>q;
int a[n];
for(int i=0;i<n;i++){
cin >>a[i];
}
while(q--){
int x,y;
cin >>x >>y;
cout <<get_total(a,x,y,n)<<"\n";
}
}
对于每个查询,它都在 n^2 中运行。 最大数组大小为 8*10^3,最大查询数为 10^5
【问题讨论】:
-
请说明您是如何研究这个的以及到目前为止您发现了什么。
-
这听起来像是字符串搜索问题。您可以使用(经过修改)Knuth-Morris-Pratt 或有限自动机。
-
我不明白如何为这个问题应用 Knuth-Morris-Pratt 或有限自动机@macmoonshine
-
功能代码的审查与 Stack Overflow 无关。此类问题属于Code Review。
-
@Makyen 这不是代码审查问题。这是一个问题,提问者展示了他解决问题的尝试(并描述了为什么它不好),正如如何提出问题所预期的那样。