关于刚刚的cf
  • 板块学术版
  • 楼主Rash10
  • 当前回复4
  • 已保存回复4
  • 发布时间2024/3/1 00:42
  • 上次更新2024/3/1 16:10:53
查看原帖
关于刚刚的cf
511408
Rash10楼主2024/3/1 00:42
#include<bits/stdc++.h>
using namespace std;

int T,n;
string s,ss;
int sh[2][100005];

constexpr int M = 1e9 + 7;
constexpr int B = 233;


inline void get_hash(string s,int type) {
  int res = 0;
  for (int i = 0; i < n; ++i) {
  	sh[type][i]=res;
    res = (long long)(res * B + s[i]) % M;
    
  }
  sh[type][n]=res;
}


int main(){
	ios::sync_with_stdio(false);
	cin>>T;
	while(T--){
		cin>>n>>s>>ss;
		string ans="",anss="";
		string s1="",s2="";
		ans+=s[0];
		int now=n;
		int num=0;
		for(int i=1;i<n;i++){
			s1+=s[i];
			s2+=ss[i-1];
		}
		for(int i=1;i<n;i++){
			char ch=s[i],chh=ss[i-1];
			if(ch>chh){
				now=i;
				break;
			}
			else if(ch==chh){
				ans+=ch;
			}
			else if(ch<chh){
				ans+=ch;
			}
		}
		for(int i=now;i<=n;i++){
			ans+=ss[i-1];
		}
		string dd="";
		dd+=s;
		dd+=ss[n-1];
		for(int i=1;i<=n-1;i++){
			anss+=ans[i];
		}
		if(dd==ans) num++;
		get_hash(anss,0);
		get_hash(s1,1);
		int dodo=n-2;
		for(int i=n-2;i>=0;i--){
			if(s2[i]!=ans[i+1]) break;
			
			if(sh[0][dodo]==sh[1][dodo]) num++;
			dodo--;
		}
		memset(sh,0,sizeof sh);
		cout<<ans<<"\n";
		cout<<num<<"\n";
	}
	return 0;
	
}

n之和不超过2e5,请问为什么一直T?

我这个复杂度不是n之和吗?

2024/3/1 00:42
加载中...