Problem A: 字符串“水”题
Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 12 Solved: 5
[ Submit][ Status][ Web Board]
Description
给出一个长度为n的字符串(1<=n<=100000),求有多少个连续字串中所有的字母都出现了偶数次。
Input
第一行一个正整数T,表示数据组数(1 <= T <= 10)。
接下来T行,每行有一个只包含小写字母的字符串。
Output
每个答案输出满足要求字符串个数。每个答案占一行。
Sample Input
3aaabbccabcabc
Sample Output
061
HINT
Append Code
类似之前做过的求k倍区间的题,只不过这个记录的位置多点,但每个位置只需记录是偶数不是偶数两个状态,并且只有27个小写字母,所以可以直接用二进制数,加个map搞一搞#include<stdio.h>
#include<string.h>
#include<math.h>
#include<string>
#include<algorithm>
#include<queue>
#include<vector>
#include<map>
#include<set>
#define eps 1e-9
#define PI 3.141592653589793
#define bs 1000000007
#define bsize 256
#define MEM(a) memset(a,0,sizeof(a))
typedef long long ll;
using namespace std;
int main()
{
int T,i,j,x;
char ch[100005];
map<int,int>p;
p.clear();
scanf("%d",&T);
while(T--)
{
long long ans=0;
p.clear();
scanf("%s",ch);
int len=strlen(ch);
int x=0;
p[0]=0;
for(i=0;i<len;i++)
{
int t=ch[i]-'a';
x^=(1<<t);
if(!p.count(x))
{
p[x]=0;
}
else
{
p[x]++;
ans+=p[x];
}
}
printf("%lld\n",ans);
}
return 0;
}
j
Problem J: 求个最大值
Time Limit: 1 Sec Memory Limit: 64 MBSubmit: 12 Solved: 2
[ Submit][ Status][ Web Board]
Description
给出n(1 <= n <= 200000)个数字ai(1 <= ai <= 1000000),i为数字的下标,按输入顺序从1开始编号一直到n,求满足ai >= aj的最大的ai % aj。
Input
第一行一个数字n,第二行n个整数。
Output
题目要求的最大值。
Sample Input
22 3
Sample Output
1
HINT
Append Code
当时看每个数值不大,感觉就要从这下手,可惜一直都没想出来,
记录每一个数j,b【j】等于小于他的最大的ai,这样枚举每个ai的倍数,取余最大的肯定是离他某个倍数k最远的,也是离他这个(k+1)倍数最近的,也就是b【(k+1)*ai】
感觉这个思路会t,结果没有加去重也过了。。。。数据可能弱一些,没t。。。。。不过这个思维挺好的
还有这个题的数据应该是有些问题的。。。
2
999997 999987
这个结果应该是10
ac代码是过不了这个数据的,相反改一下这个地方for(j=2*a[i];j<=min(maxx+a[i],1000005);j+=a[i])
改成for(j=2*a[i];j<=maxx+a[i];j+=a[i]),这个数据可以过,但交是wa的。。。。其实就应该是这样写,要多枚举一个倍数
#include<bits/stdc++.h>
using namespace std;
int minn[2000005];
int a[200005];
int cmp(int u,int v)
{
return u<v;
}
int main()
{
int n,i,j;
scanf("%d",&n);
int maxx=0;
for(i=0;i<n;i++)
scanf("%d",&a[i]),maxx=max(maxx,a[i]);
sort(a,a+n,cmp);
a[n]=2000004;
for(i=0;i<n;i++)
{
for(j=a[i]+1;j<=a[i+1];j++)
{
minn[j]=a[i];
}
}
// cout<<minn[3]<<endl;
int ans=0;
for(i=0;i<n;i++)
{
for(j=2*a[i];j<=min(maxx+a[i],1000005);j+=a[i])
{
ans=max(ans,minn[j]%a[i]);
}
}
cout<<ans<<endl;
return 0;
}
关于去重,可以开一个标记。。。。。。
#include<bits/stdc++.h>
using namespace std;
int minn[2000005];
int book[2000005];
int a[200005];
int cmp(int u,int v)
{
return u<v;
}
int main()
{
int n,i,j;
scanf("%d",&n);
int maxx=0;
for(i=0;i<n;i++)
scanf("%d",&a[i]),maxx=max(maxx,a[i]),book[a[i]]=1;
sort(a,a+n,cmp);
a[n]=2000004;
for(i=0;i<n;i++)
{
for(j=a[i]+1;j<=a[i+1];j++)
{
minn[j]=a[i];
}
}
// cout<<minn[3]<<endl;
int ans=0;
for(i=0;i<n;i++)
{
if(book[a[i]]==2)
continue;
book[a[i]]++;
for(j=2*a[i];j<=min(maxx+a[i],1000005);j+=a[i])
{
ans=max(ans,minn[j]%a[i]);
if(book[j])
break;
}
}
cout<<ans<<endl;
return 0;
}