临洮巨人
来源:互联网 发布:青岛知豆电动车租赁500 编辑:程序博客网 时间:2024/04/28 10:41
题目描述:
输入:
一行一个由大写字母A到L组成的字符串S。
ABACABA
输出:
2
样例解释:BAC和CAB
数据范围:
对于30%的数据,|S|<=100。
对于70%的数据,|S|<=1000。
对于100%的数据,1<=|S|<=1000000。
分析:
70%:
用a[i],b[i],c[i]分别表示在第i个位置,a、b、c分别出现了多少次。
枚举一个区间i,j,那么,当a[i]-a[j]=b[i]-b[j]=c[i]-c[j]时这个区间就是合法的。
时间复杂度
100%:
我们知道a[i]-a[j]=b[i]-b[j]=c[i]-c[j],化简得
a[i]-b[i]=a[j]-b[j]
b[i]-c[i]=b[j]-c[j]
设x=a[i]-b[i],y=b[i]-c[i],z=x*
这个z会很大,我们用hash去维护。
z也可能是负数,hash时在mod之前要对z取绝对值。
CODE:
#include<cstdio>#include<cstring>#include<algorithm>const long long add=10000;const long long mo=10000007;long long n,f[4][1000001],a[1000001],h[2][10000007],x1,x2,x3;long long get(long long x,long long y){ long long i=abs(x+y)%mo; while (h[0][i]!=-9114861777597660799 && h[0][i]!=x+y) { i++; } return i;}int main(){ long long i,j,k; char c; scanf("%c",&c); while (c>='A' && c<='Z') { n++; a[n]=c-'A'+1; scanf("%c",&c); } long long ans=0; long long x=0,y=0; long long z; memset(h[0],-0x7f,sizeof(h[0])); for (i=0;i<=n;i++) { if (i==200000) { printf(""); } if (a[i]==1) x1++; else if (a[i]==2) x2++; else if (a[i]==3) x3++; x=x1-x2; y=x2-x3; z=get(x*add,y); ans+=h[1][z]; h[0][z]=x*add+y; h[1][z]++; } printf("%lld",ans);}
1 0
- 临洮巨人
- 看巨人,学巨人,超巨人
- 蓝色巨人
- 《面对巨人》
- 巨人下半场
- 巨人下半场
- 巨人养成
- 进击的巨人之铠之巨人,超大型巨人
- 巨人何以成为巨人--[作者]摩罗
- 文化部要求巨人网络整改《巨人》游戏
- 巨人回来了!
- 巨人如何聚人
- 绿巨人2008攻略
- 巨人网络笔试题
- 巨人网络java笔试
- 目标:巨人网络!
- 怎么学习巨人
- 巨人们的道理
- Spring Data整合Mysql
- 全面分析 Spring 的编程式事务管理及声明式事务管理
- 蓝桥杯 2的次幂表示 解题报告(递归)
- 国产数据库介绍:达梦数据库
- Mybatis分页插件PageHelper的简单使用
- 临洮巨人
- C语言与C++文件的I/O操作
- aaadagsa
- 【codeforces 550C】Divisibility by Eight
- Ubuntu14.04+caffe+cuda8.0+cudnn v5.1配置
- lintcode,电话号码的字母组合
- [AHK]联动通达信其实很简单
- c#中怎样在打开一个form后让第二个form出现一段时间后消失
- Makefile 中:= ?= += =的区别