搬运我的洛谷题解,原文创作时间:2026-03-19 22:32。

思路:

这道题由于字符串长度太长了,所以不能用简单的 find 函数,需要使用 KMP 算法。

KMP 算法是一种高效的字符串匹配算法,可以利用已经匹配好的信息,来避免主串的指针回溯。这样时间复杂度就会降低,变成 $O(n+m)$。

先要把字符串 $l$ 的 $A$ 与 $T$, $G$ 与 $C$,一对一交换配对,最后用 KMP 进行匹配即可。

代码:

#include<bits/stdc++.h> 
using namespace std;
int main(){
    string l,s;
    cin>>l>>s;
    string t="";
    for(char ch:s){
        if(ch=='A') t+='T';
        else if(ch=='T') t+='A';
        else if(ch=='G') t+='C';
        else if(ch=='C') t+='G';
    }
    vector<int>next(s.size());
    for(int i=1,j=0;i<s.size();i++){
        while(j&&t[i]!=t[j]){
            j=next[j-1];
        }
        if(t[i]==t[j]){
            j++;
        }
        next[i]=j;
    }
    for(int i=0,j=0;i<l.size();i++){
        while(j&&l[i]!=t[j]){
            j=next[j-1];
        }
        if(l[i]==t[j]){
            j++;
        }
        if(j==s.size()){
            cout<<i-s.size()+2;
            return 0;
        }
    }
    cout<<0;
	return 0; 
}