HGOI2010816 (NOIP 提高组模拟赛 day1)
Day1 210pts(含T1莫名的-10pts和T3莫名的-30pts)
100+70+40=210
rank 29
这道题第一眼看是字符串匹配问题什么KMP啊,又想KMP不会做啊,那就RK Hash 吧,结果Hash打了一半发现Hint:要全排列,
然后掐指一算3000!一定爆所以换思路,对于区间[l,r]字符种类和对应数目与前面那个串完全相同就是一个匹配,常数是52,应该能过
# include <bits/stdc++.h>
using namespace std;
char a[],b[];
int sta[],stb[],lena,lenb;
int fun(char ch)
{
if ('A'<=ch&&ch<='Z') return ch-'A'+;
else return ch-'a'++;
}
bool check()
{
for (int i=;i<=;i++)
if (sta[i]!=stb[i]) return false;
return true;
}
int main()
{
freopen("mayan.in","r",stdin);
freopen("mayan.out","w",stdout);
int t1,t2; scanf("%d%d",&t1,&t2);
getchar();
for (int i=;i<=t1;i++) a[i]=getchar(); getchar();lena=t1;
for (int i=;i<=t2;i++) b[i]=getchar(); getchar();lenb=t2;
for (int i=;i<=lena;i++) {sta[fun(a[i])]++;}
int ans=;
for (int i=;i<=lenb;i++) {
if (i<=lena-) { stb[fun(b[i])]++;continue;}
else if (i==lena) {
stb[fun(b[i])]++;
if (check()) ans++;
continue;
}
stb[fun(b[i-lena])]--; stb[fun(b[i])]++;
if (check()) ans++;
}
printf("%d\n",ans);
return ;
}
事情是这样的,求形如(a...a)(b....b)或(a.....a)的子序列个数
如abba中{a,b,ab,bb,ba,abb,bba}有且有7个
于是考场上写出20行的STL代码,70分!跟我一起念:STL大法好qwq
70pts(MLE/TLE)
# include <bits/stdc++.h>
using namespace std;
set<string>stt; string s;
int main()
{
freopen("strange.in","r",stdin);
freopen("strange.out","w",stdout);
cin>>s;
int len=s.length();
char ch1,ch2;
for (int i=;i<len;i++) {
ch1=s[i]; int j=i;
while (j<len&&s[j]==ch1) { j++; stt.insert(s.substr(i,j-i));}
ch2=s[j];
while (j<len&&s[j]==ch2) { j++; stt.insert(s.substr(i,j-i));}
}
int ans=,i;
printf("%d\n",stt.size());
return ;
}
好了讲正解,vector[i][j]表示形如(i....i)(j....j)的二元组(x,y)表示有x个i,y个j组成,然后就会对于每个vecort都会有二元组,然后面积求和即可
然后把所有面积的并集求出来就是vector[i][j]的值,然后把各值求出来累加就行了。
# include <bits/stdc++.h>
using namespace std;
struct Node{
int x,y;
};
vector <Node> a[][];
Node m[];
int n;
bool cmp(Node aa,Node bb)
{
if (aa.x!=bb.x) return aa.x>bb.x;
else return aa.y>bb.y;
}
char s[];
int fun()
{
sort(m+,m++n,cmp);
int X=m[].x,Y=m[].y;
int S=X*Y;
for (int i=;i<=n;i++)
if (m[i].y>Y) {
S=S+(m[i].y-Y)*m[i].x;
X=m[i].x;Y=m[i].y;
}
return S;
}
int main()
{
scanf("%s",s+);
int len=strlen(s+);
int i;
for (i=;i<=len;i++) {
char ch1,ch2;
int cnt1=,cnt2=;
ch1=s[i]; int j=i;
while (j<=len&&s[j]==ch1) j++,cnt1++;
if (j>len) j=len; ch2=s[j];
int kk=j-;
while (j<=len&&s[j]==ch2) j++,cnt2++;
if (ch1==ch2) continue;
Node N; N.x=cnt1; N.y=cnt2;
a[ch1-'a'+][ch2-'a'+].push_back(N);
i=kk;
}
int ans=;
for (int i=;i<=;i++)
for (int j=;j<=;j++)
{
n=(int)(a[i][j].size());
memset(m,,sizeof(m));
for (int k=;k<=n;k++) m[k]=a[i][j][k-];
ans=ans+fun();
}
for (int i=;i<=;i++) {
int cnt=,maxx=;
bool flag=false;
for (int j=;j<=len;j++) if (s[j]==i+'a'-) flag=true;
for (int j=;j<=len;j++) {
while (s[j]==i+'a'-&&s[j+]==i+'a'-&&j<len) j++,cnt++;
maxx=max(maxx,cnt);
cnt=;
}
if (flag)ans=ans+maxx+;
}
printf("%d\n",ans);
return ;
}
std:
#include <bits/stdc++.h>
using namespace std;
template <typename T> void read(T &t) {
char ch=getchar(); int f=; t=;
while (''>ch||ch>'') { if (ch=='-') f=-; ch=getchar(); }
do { (t*=)+=ch-''; ch=getchar(); } while (''<=ch&&ch<=''); t*=f;
}
typedef long long ll;
const int maxn=;
int n,k,x[maxn],a[maxn],sz;
map<int,int> m;
ll ans;
int main() {
read(n); read(k);
for (int i=;i<=n;i++) {
read(x[i]); m[x[i]]++;
}
sort(x+,x+(n+));
for (int i=;i<=n;i++)
if (x[i]!=x[i-]) a[++sz]=x[i];
int pos=,c1=,c2=;
for (int i=;i<=sz;i++) {
while (pos<sz&&a[pos+]<=(ll)a[i]*k) {
pos++;
if (m[a[pos]]>=) c1++;
else c2++;
}
int v=;
if (m[a[i]]>=) v++;
int s=c1+c2-;
ans+=*(c1-v);
if (s>) ans+=3LL*s*(s-);
if (m[a[i]]>=) ans+=*(c1+c2-);
if (m[a[i]]>=) ans++;
if (m[a[i]]>=) c1--; else c2--;
}
cout<<ans<<endl;
return ;
}
HGOI2010816 (NOIP 提高组模拟赛 day1)的更多相关文章
- 【洛谷】NOIP提高组模拟赛Day1【组合数学】【贪心+背包】【网络流判断是否满流以及流量方案】
U41568 Agent1 题目背景 2018年11月17日,中国香港将会迎来一场XM大战,是世界各地的ENLIGHTENED与RESISTANCE开战的地点,某地 的ENLIGHTENED总部也想派 ...
- [LUOGU] NOIP提高组模拟赛Day1
题外话:以Ingress为题材出的比赛好评,绿军好评 T1 考虑枚举第\(i\)个人作为左边必选的一个人,那左边剩余\(i-1\)个人,选法就是\(2^{i-1}\),也就是可以任意选或不选,右侧剩余 ...
- 洛谷 NOIP提高组模拟赛 Day1
传送门 ## $T1$ 一道结论题,设原来A队能力最大的是x,那么A队的选择方案就是$2^{x-1}$,B队的选择方案就是$(2^{n-x}-1)$种,因为不能不选.其中$1\leq x\leq n$ ...
- 计蒜客 2017 NOIP 提高组模拟赛(四)Day1 T2 小X的密室
https://nanti.jisuanke.com/t/17323 小 X 正困在一个密室里,他希望尽快逃出密室. 密室中有 N 个房间,初始时,小 X 在 1号房间,而出口在 N号房间. 密室的每 ...
- 10-18 noip提高组模拟赛(codecomb)T1倍增[未填]
T1只想到了找环,> <倍增的思想没有学过,所以看题解看得雨里雾里的(最近真的打算学一下! 题目出的挺好的,觉得noip极有可能出现T1T2T3,所以在此mark 刚开始T1以为是模拟,还 ...
- 10-18 noip提高组模拟赛(codecomb)T2贪心
T2:找min:一直找最小的那个,直到a[i]-x+1小于0,就找次小的,以此类推: 求max,也是一样的,一直到最大的那个,直到次大的比之前最大的大,就找次大的: 这个模拟,可以用上priority ...
- HGOI20180815 (NOIP 提高组模拟赛 day2)
Day 2 rank 11 100+35+30=165 本题是一道数论题,求ax+by=c的正整数对(x,y) x>=0并且y>=0 先说下gcd: 求a,b公约数gcd(a,b) 如gc ...
- 【洛谷】NOIP提高组模拟赛Day2【动态开节点/树状数组】【双头链表模拟】
U41571 Agent2 题目背景 炎炎夏日还没有过去,Agent们没有一个想出去外面搞事情的.每当ENLIGHTENED总部组织活动时,人人都说有空,结果到了活动日,却一个接着一个咕咕咕了.只有不 ...
- noip提高组模拟赛(QBXT)T2
T2count题解 [ 问题描述]: 小 A 是一名热衷于优化各种算法的 OIER,有一天他给了你一个随机生成的 1~n 的排列, 并定 义区间[l,r]的价值为: \[ \huge C_{l,r}= ...
随机推荐
- DDD China Conference 2017
DDD China Conference 2017 时间:2017.12.9地点:国际会议中心
- PYQT5实现控制台显示功能
首先,写一个信号,用来发射标准输出作为信号 class EmittingStream(QtCore.QObject): textWritten = QtCore.pyqtSignal(str) #定义 ...
- ajax传递数组给controller的实现方法和坑
这里是前端向后端传递一个数组的方式,参考下面这个示例: (主要是将前端的数组,用 JSON.stringify() 方法json化一下,然后后端springmvc接收到以后,使用 JSONArray ...
- WPF DataGrid列设置为TextBox控件的相关绑定
在wpf的DataGrid控件中,某一列的数据模板为TextBox控件的话,绑定Text="{Binding TxtSn, UpdateSourceTrigger=PropertyChang ...
- Mysql_游标
MySQL中的游标是一个十分重要的概念.游标提供了一种对从表中检索出的数据进行操作的灵活手段,就本质而言,游标实际上是一种能从包括多条数据记录的结果集中每次提取一条记录的机制.MySQL中的游标的语法 ...
- 504. Base 7
Given an integer, return its base 7 string representation. Example 1: Input: 100 Output: "202&q ...
- Git 命令简单罗列
源教程出自 廖雪峰的官方网站 https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000 整 ...
- mysql学习(1)
开始我们基础的mysql学习 第一部分:补充知识 1. 昨天讲到的mysql初始化密码为空,今天又get到一种新的方法 Mysql安装后需要做的 Mysql安装成功后,默认的root用户密码为空,你可 ...
- Notes of Daily Scrum Meeting(11.12)
今天我们召开了Beta阶段MOOC项目开发的第一次Scrum Meeting,在会上就alpha阶段进行了总结,然后我们确定了 接下来的Beta阶段的项目分工,并且就每天的进度汇报做了一个约定,就是每 ...
- SDN开源项目以及组织机构
SDN开源项目以及组织机构 以上内容均摘自网络 如有侵权,请转告笔者,立即删除 两大组织 ONF (Open Networking Foundation) Google.Facebook.Micros ...