84pts RE求后四个点RE求助(问题代码区域已经锁定)
查看原帖
84pts RE求后四个点RE求助(问题代码区域已经锁定)
1112954
lsc72楼主2024/8/2 21:54
#include<bits/stdc++.h>
using namespace std;
int zt1,zt2,num2[200010],k[100][200010],nest[200010],T,ton1[1000],ton2[1000];
long long ans;
string s;
int main(){
	ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
	cin>>T;
	while (T--){
		cin>>s;
		ans=0;
		zt1=0; zt2=0;
      //这里开始
		for (int i=1;i<=s.size();i++){
			num2[i]=nest[i]=0;
			for (int j=0;j<=28;j++) k[j][i]=0;
		} 
		for (int j=0;j<=28;j++) ton1[j]=ton2[j]=0;
		for (int i=s.size();i>=1;i--) {
			ton1[s[i-1]-'a'+1]++;
			if (ton1[s[i-1]-'a'+1]&1) zt1++;
			else zt1--;
			num2[i]=zt1;
		}
		for (int i=1;i<=s.size();i++) {
			ton2[s[i-1]-'a'+1]++;
			if (ton2[s[i-1]-'a'+1]&1) zt2++;
			else zt2--;
			k[zt2][i]++;
		}
      //这里结束
		for (int j=0;j<=27;j++)
			for (int i=1;i<=s.size();i++)
				k[j][i]+=k[j][i-1];
		for (int i=1;i<=s.size();i++)
			for (int j=1;j<=27;j++)
				k[j][i]+=k[j-1][i];
			
		for (int i=2;i<=s.size();i++){
			int p=i-1;
			while (nest[p]<s.size()&&p>0&&s[i-1]!=s[nest[p]]) p=nest[p];
			if (p>0) nest[i]=nest[p]+1;
		}
		for (int i=1;i<s.size();i++){
			ans+=k[num2[i+1]][i-1];
			for (int j=i+i;j<s.size();j+=i){
				if (j-nest[j]&&i%(j-nest[j])==0) 
					ans+=k[num2[j+1]][i-1];
			}
		}
		cout<<ans<<'\n';
	}
	return 0;
}

被折磨坏了,代码都改抽象了。

2024/8/2 21:54
加载中...