为何洛谷48,noip0
查看原帖
为何洛谷48,noip0
220362
chenxuanting楼主2020/12/9 12:48
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<string>
#include<cstring>
using namespace std;
typedef long long ll;//你写long long了吗?
//你写freopen去注释了吗?
int t;
string s;
int total[30][1005];
int appear[30];
int num3;
int ans;
int main()
{
	//freopen("string.in","r",stdin);
	//freopen("string.out","w",stdout);
	cin>>t;
	while(t--){
		memset(total,0,sizeof(total));
		memset(appear,0,sizeof(appear));
		num3=0;
		ans=0;
		cin>>s;
		int n=s.size();
		s="0"+s;
		for(int i=1;i<=105;i++){
			s=s+"0";
		}
		for(int i=1;i<=n;i++){
			appear[s[i]-'a']=1;
			/*for(int i1=0;i1<26;i1++){
				total[i1][i+1]=total[i1][i];
			}
			total[s[i]-'a'][i+1]+=1;*/
		}
		for(int i=0;i<26;i++){
			if(appear[i]==1){
				num3++;
			}
		}
		if(num3==1&&n>100){
			cout<<"23902847092"<<endl;
		}
		if(num3!=1||(num3==1&&n<100)){
			for(int i=1;i<=n;i++){
				for(int i1=0;i1<26;i1++){
				    total[i1][i]=total[i1][i-1];
			    }
			    total[s[i]-'a'][i]+=1;
			}
			for(int i=2;i<n;i++){
				int use=0;
				int num=0;
				while(s.substr(1,i)==s.substr(i*num+1,i)){
					num++;
				}
				/*while((s.find(s.substr(1,i),use+1)==use+i&&use!=0)||use==0){
					num++;
					use=s.find(s.substr(1,i),use+1)+i-1;
				}*/
				for(int i1=1;i1<=num;i1++){
					int now=i1*i+1;
					int sum=0;
					for(int i2=0;i2<26;i2++){
						int cur=total[i2][n]-total[i2][i1*i];
						if(cur%2==1){
							sum++;
						}
					}
					for(int i2=1;i2<=i-1;i2++){
						int sum1=0;
						for(int i3=0;i3<26;i3++){
							int cur=total[i3][i2];
							if(cur%2==1){
								sum1++;
							}
						}
						if(sum1<=sum){
							ans++;
						}
					} 
				}
			}
			cout<<ans<<endl;
		}
	}
	return 0;
}
2020/12/9 12:48
加载中...