玄关???(为什么改成这样就过了)
查看原帖
玄关???(为什么改成这样就过了)
1201196
Zhenghw楼主2024/6/30 13:34
#include<map>
#include<set>
#include<iostream>
using namespace std;
const int M=1e5+5;
set<string>s;
string t,b[M];
map<string,int>mp;
int i,j,n,m,tot,all,minn=1e9;
int main(){
    cin.tie(0),cout.tie(0);
    ios::sync_with_stdio(false);
    cin>>n;
    for(i=0;i<n;i++)
        cin>>t,mp[t]=0,s.insert(t);
    cin>>m;
    for(i=0;i<m;i++){
        cin>>b[i];
        set<string>::iterator it=s.find(b[i]);
        if(it!=s.end()) all++,s.erase(it);
    }cout<<all<<'\n'; //算单词出现次数
    if(!all){
        cout<<0;
        return 0;
    }for(i=0;i<m;i++){
        map<string,int>::iterator it;
        while(j<m&&tot<all){ //必须满足所有all个单词都在里面才能画
            it=mp.find(b[j++]);
            //if(it!=mp.end())
                tot+=it->second++==0; //如果这个单词还没出现过就加到tot上
        }if(tot<all) break;
        //这个条件表示如果j指针已经走到最后还无法满足all个单词的话,之后更短的距离也一定不能满足,直接跳出循环
        minn=min(j-i,minn); //算长度
        it=mp.find(b[i]);
        tot-=!--it->second; //如果这是这条中唯一的一个单词,tot就-1
    }cout<<minn;
    return 0;
}

如果把上面注释的那一行代码取消注释掉就只能过4个点WA记录然而我把那行代码注释掉以后直接就过了AC记录这是为什么???

2024/6/30 13:34
加载中...