求助,为什么会TLE#11?【悬关】
查看原帖
求助,为什么会TLE#11?【悬关】
780539
qwertim楼主2023/8/18 17:15
#include<bits/stdc++.h>
#define l size()-1
#define fo(i,l,r) for(int i=l;i<=r;i++)
#define fd(i,r,l) for(int i=r;i>=l;i--)
using namespace std;
int dp[26][1005];//dp_i,j为:在s1的第j位后(包括自己)首个字符为char(i+'a')的位置
int lpos,pos,ans=1;
string s1,s2;
map<char,bool>mp;
int main(){
	cin>>s1>>s2;
	fo(i,0,s1.l)mp[s1[i]]=1;
	fo(i,0,s2.l)
		if(!mp[s2[i]])return cout<<-1,0;//s2中有s1中没有的字符则为-1
	fo(i,0,25)
		if(mp[i+'a']){
			int tmp=s1.l+1;
			fd(j,s1.l,0){//倒序遍历求出dp_i,j
				if(s1[j]==i+'a')tmp=j;
				dp[i][j]=tmp;
			}
			fo(j,0,s1.l)
				if(dp[i][j]==s1.l+1)dp[i][j]=tmp;//第一个为char(i+'a')的位置也算
		}
	fo(i,0,s2.l){
		if(s2[i]==s2[(i+s2.l)%s2.size()]){//看s2_i是否与上一字符相等
			//因为s2_0的上一位为s2_(s2.l)
			//所以上一位为s2_( (i-1+s2.size() ) % s2.size() )=s2_( (i+s2.l) % s2.size() )
			lpos=pos;
			pos=dp[s2[i]-'a'][(pos+1)%s1.size()];
			//如s2_i与上一字符相等,则取dp_(s2[i]-'a'),pos时还会等于pos
			//而因为只有一个字符,所以只能取dp_(s2[i]-'a'),(pos+1)%s1.size() 
		}
		else{
			lpos=pos;
			pos=dp[s2[i]-'a'][pos];//取这个字符在s1中下一个出现位置
		}
		if(pos<=lpos)ans++;//当pos<=lpos时,相当于又绕回去了,则又多用了一个s1,ans++ 
	}
	cout<<ans;
	return 0;
}

评测记录

2023/8/18 17:15
加载中...