1001
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;
const int maxn=100000+100;
char s[maxn];
int main()
{
int n;
scanf("%d",&n);
while(n--)
{
scanf("%s",s);
int len=(int)strlen(s);
vector<int> v;
int cnt=0;
for(int i=0;i<len;i++){
if(s[i]=='q') cnt++;
else {if(cnt) v.push_back(cnt);cnt=0;}
}
if(cnt) v.push_back(cnt);
long long ans=0;
for(int i=0;i<v.size();i++){
long long sum=0;
for(int j=1;j<=v[i];j++){
sum+=j;
}
ans+=sum;
}
cout<<ans<<endl;
}
return 0;
}
1002
比赛的时候TLE到死,本来可以两题的。
有时候键值很少,数据却很大时,可以用map,因为如果用vis数组来判的话,会跑过非常多的不必要点,造成时间浪费,而map跑的都是关键点,能省不少时间。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<map>
using namespace std;
const int maxn=100000+10;
int a[maxn];
map<int,int> A,B;
int ans[maxn];
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++) A[i]=0;
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
int zq=1,k=0;
while(zq<=n)
{
while(n%zq!=0&&zq<=n) zq++;
if(n%zq==0)
{
A.clear();
bool ok=true;
for(int i=1;i<=zq;i++) A[a[i]]++;
for(int i=1;i<=n/zq-1;i++)
{
B=A;
for(int j=i*zq+1;j<=zq*(i+1);j++)
{
B[a[j]]--;
if(B[a[j]]<0) {ok=false;break;}
}
if(ok==false) break;
}
if(ok) ans[k++]=zq;
}
zq++;
}
for(int i=0;i<k;i++) printf("%d%s",ans[i],(i==k-1)?"":" ");printf("\n");
}
return 0;
}