目标48分的暴力,样例未过,大佬求条
查看原帖
目标48分的暴力,样例未过,大佬求条
768530
Expert_Dream楼主2023/11/15 05:01

rt

#include<bits/stdc++.h>
#define ll long long
#define ull unsigned long long
#define pii pair<int,int>
#define fir first
#define se second
#define endl '\n'
#define debug puts("AK IOI")
using namespace std;
const int N = 1005;
int t;
string s;
int n;	
int q[N][N];
vector<int> v[N];
int mp[N][N];
int h[N];
int vis[30];
int main(){
	cin >> t;
	while(t--){
		memset(q,0,sizeof q);
		memset(h,0,sizeof h);
		memset(mp,0,sizeof mp);
		int ans=0;
		cin >> s;
		n=s.size();
		s=' '+s;
		for(int i = 1;i <= n;i++){//预处理i到j的F值
			memset(vis,0,sizeof vis);
			int res=0;
			for(int j = i;j <= n;j++){
				vis[s[j]-'a']++;
				if(vis[s[j]-'a'] & 1)res++;
				else res--;
				q[i][j]=res;
			}
		}memset(vis,0,sizeof vis);
		int res=0;
		for(int i = n;i >= 1;i--){
			vis[s[i]-'a']++;
			if(vis[s[i]-'a'] & 1) res++;
			else res--;
			h[i] = res;
		}
		for(int i = 1;i <= n;i++)v[i].clear();
		for(int i = 2;i <= n;i++){
			if(s[i] == s[1])v[1].push_back(i);
			mp[1][i]=1;
		}		
		for(int len = 2;len <= n;len ++){
			for(auto it:v[len-1]){
				if(it+len-1 <= n && s[it+len-1] == s[len]) {v[len].push_back(it);mp[len][it]=1;}
			}
		}
		
		for(int len = 1;len <= n-2;len++){
			for(int i = 2;i*i <= n-len;i++){
				if((n-len) % i == 0 && (n-len) != i){
					int x=i;
					for(int j = 1;j < x;j++){
						bool ok=1;
						for(int k = x+1;k <= n-len;k+=x){
							if(!mp[j][k]){ok=0;break;}
						}if(ok){
							if(q[1][j] <= h[n-len+1]) ans++;
						}
					}x=(n-len)/i;
					for(int j = 1;j < x;j++){
						bool ok=1;
						for(int k = x+1;k <= n-len;k+=x){
							if(!mp[j][k]){ok=0;break;}
						}if(ok){
							if(q[1][j] <= h[n-len+1]) ans++;
						}
					}
				}
			}
		}
		cout<<ans<<endl;
	}
	return 0;
}

2023/11/15 05:01
加载中...