心上人

【问题描述】 

人到初三,总会遇到情感问题,比方说小 J 就喜欢上了小 W。于是小 J 就需要说一长串的话讨小 W 欢心。现在已知小 W 听到一些词就会很高兴,而且白听不厌,但她又讨厌小 J 说的话的长度短于或长于她所期望的。所以小 J 只能说一个长度为 L 的字符

串,并使小 W 喜欢的词在其中出现的次数尽量多。小 J 想请你告诉他,一个长度为 L 的字符串中最多出现小 W 喜欢的话多少次。。。

【输入格式】  

输入共 2 行。

第 1 行包含 1 个正整数 L,表示 小 J 需要的字符串的长度。

第 2 行包含一个由小写字母组成的字符串 S,表示小 W 喜欢听到的词

【输出格式】

输出共 1 行,一个正整数 Ans,表示小 J 说的话中最多出现多少次小 W 喜欢的词。

(小 W 喜欢的词在小 J 说的话中只要起始位置不同,就算出现一次,即重叠的词计

数)

【输入实例】

5
aba

【输出实例】

2

【其他说明】

对于 30%的数据,保证小 W 喜欢的词不会在文中出现重叠对于 100%的数据,保证|S|<=L<=1000

【试题分析】

如果一看过去觉得自己一分也拿不到的人,那是没救了……

30%的数据其实就是看看输入的字符串like里面有没有一个字符满足:从其开始一直到字符串的最末端是否与另一个与输入字符串相同的串从始至终都是匹配的。

我知道这么说有点绕,但是至少要想明白一点:满足这个字符的点其后面必须跟另一个相同字符串的a[0]往后,知道自己原串这边的尽头坐标全是匹配的。

我们来看看这一块的代码:

lenl=strlen(love);
strcpy(love2,love);
for(int i=1;i<lenl;i++)//从原串的1到末尾枚举
if(love[i]==love2[0])//如果原串的第i位等于原串的第0位了,那么可以去尝试搜索了
{
for(int j=1;j<lenl-i;j++)
if(love[i+j]!=love2[j])//对比
{hl=false;break;}//不等于了,就直接继续
}

 当然,如果你和厉害的话,可以写烤馍片算法(KMP),由于已经可以了,所以我就不在写了。

然后,我们可以创造一个空字符串去模拟,挨个往里面接。

                longl=len;
for(int i=0;i<len;i++) slike[i]=str[i],struse[i]=1;
for(int i=1;i<L&&longl<=L;i++)
{
int j=i;
if(str[0]==slike[i])
{
for(int k=0;k<len;k++)
{
if(str[k]==slike[i+k]) continue;
else if(struse[i+k]==0)
{
for(;k<len&&longl<=L;k++)
{
struse[i]==1;
slike[i+k]=str[k];
longl++;
}
if(longl<=L)ans++;
break;
}
}
}
}
cout<<ans;

来看看暴力的代码:

#include<iostream>
#include<cstring>
using namespace std;char b[1001],c[1001];
int huiwen(char *a)
{
int n,i,j,k;
n=strlen(a);
if(n==1) return 0;
for(i=0;i<n;i++) b[i]=a[n-i-1];
strcpy(c,a);
if(strcmp(c,b)==0) return 1;
return 0;
}
char str[1001],slike[1001];
int struse[1001];
int main()
{
int L,longl;
cin>>L;
cin>>str;
int len=strlen(str),ans=1;
if(huiwen(str)==0) cout<<L/len;
else if(L>=len)
{
longl=len;
for(int i=0;i<len;i++) slike[i]=str[i],struse[i]=1;
for(int i=1;i<L&&longl<=L;i++)
{
int j=i;
if(str[0]==slike[i])
{
for(int k=0;k<len;k++)
{
if(str[k]==slike[i+k]) continue;
else if(struse[i+k]==0)
{
for(;k<len&&longl<=L;k++)
{
struse[i]==1;
slike[i+k]=str[k];
longl++;
}
if(longl<=L)ans++;
break;
}
}
}
}
cout<<ans;
}
else cout<<0;
}
/* */

当然,这样做是有大BUG的,如果你输入7 abaa,它会输出1,你只需把回文那一块换成上面我们所提到的匹配就好了。

我的最终做法是O(玄学)的,是不是很神奇?只要你维护了求解只需O(1)!

那么怎么做呢?

我的做法都是瞎yy求公式出来的,我们想一想,记录一个beg,表示第一个符合条件点的坐标。

让后把这个坐标以前(包括)的点都从L里面减去,然后按周期求即可。

【代码】

#include<iostream>
#include<cstring>
using namespace std;
char love[1100],love2[1100];
int L,lenl,beg;
int ans=0;
bool same=false;
int main()
{
scanf("%d%s",&L,&love);
lenl=strlen(love);
if(lenl>L) {printf("0");return 0;}//如果连一个串都塞不下,那么就可以直接输出
strcpy(love2,love);
for(int i=1;i<lenl;i++)
if(love[i]==love2[0])
{
bool hl=true;
for(int j=1;j<lenl-i;j++)
if(love[i+j]!=love2[j])
{hl=false;break;}//比对、记录
if(hl==true)
{
same=true;//标为存在这样的点
beg=i;//记录坐标
break;//我们如果发现一个就可以停止比对了
}
}
if(same==false)//如果没有符合条件的点,那么就直接输出L/lenl
{
printf("%d",(int)L/lenl);
return 0;
}
else
{
if(beg==lenl-1)//推公式,beg在最后一个时跟其它情况不太一样,要单独考虑
{
lenl--;
L--;
int now=beg;
ans=(int)(L-lenl)/(lenl);
ans++;
printf("%d",(int)ans);
}
else
{
int L1=lenl-1;
L1-=beg;
L-=(beg+1);
int ans=(int)L/L1;
printf("%d",(int)ans);
}
}
}

 

【NOIP模拟赛】lover——心上人的更多相关文章

  1. NOIP模拟赛20161022

    NOIP模拟赛2016-10-22 题目名 东风谷早苗 西行寺幽幽子 琪露诺 上白泽慧音 源文件 robot.cpp/c/pas spring.cpp/c/pas iceroad.cpp/c/pas ...

  2. contesthunter暑假NOIP模拟赛第一场题解

    contesthunter暑假NOIP模拟赛#1题解: 第一题:杯具大派送 水题.枚举A,B的公约数即可. #include <algorithm> #include <cmath& ...

  3. NOIP模拟赛 by hzwer

    2015年10月04日NOIP模拟赛 by hzwer    (这是小奇=> 小奇挖矿2(mining) [题目背景] 小奇飞船的钻头开启了无限耐久+精准采集模式!这次它要将原矿运到泛光之源的矿 ...

  4. 大家AK杯 灰天飞雁NOIP模拟赛题解/数据/标程

    数据 http://files.cnblogs.com/htfy/data.zip 简要题解 桌球碰撞 纯模拟,注意一开始就在袋口和v=0的情况.v和坐标可以是小数.为保险起见最好用extended/ ...

  5. 队爷的讲学计划 CH Round #59 - OrzCC杯NOIP模拟赛day1

    题目:http://ch.ezoj.tk/contest/CH%20Round%20%2359%20-%20OrzCC杯NOIP模拟赛day1/队爷的讲学计划 题解:刚开始理解题意理解了好半天,然后发 ...

  6. 队爷的Au Plan CH Round #59 - OrzCC杯NOIP模拟赛day1

    题目:http://ch.ezoj.tk/contest/CH%20Round%20%2359%20-%20OrzCC杯NOIP模拟赛day1/队爷的Au%20Plan 题解:看了题之后觉得肯定是DP ...

  7. 队爷的新书 CH Round #59 - OrzCC杯NOIP模拟赛day1

    题目:http://ch.ezoj.tk/contest/CH%20Round%20%2359%20-%20OrzCC杯NOIP模拟赛day1/队爷的新书 题解:看到这题就想到了 poetize 的封 ...

  8. CH Round #58 - OrzCC杯noip模拟赛day2

    A:颜色问题 题目:http://ch.ezoj.tk/contest/CH%20Round%20%2358%20-%20OrzCC杯noip模拟赛day2/颜色问题 题解:算一下每个仆人到它的目的地 ...

  9. CH Round #52 - Thinking Bear #1 (NOIP模拟赛)

    A.拆地毯 题目:http://www.contesthunter.org/contest/CH%20Round%20%2352%20-%20Thinking%20Bear%20%231%20(NOI ...

  10. CH Round #49 - Streaming #4 (NOIP模拟赛Day2)

    A.二叉树的的根 题目:http://www.contesthunter.org/contest/CH%20Round%20%2349%20-%20Streaming%20%234%20(NOIP 模 ...

随机推荐

  1. Android笔记:java 中的数组

    在与嵌入式设备通讯的过程中使用的socket通讯 获取的字节流,通常转换为字节数组,需要根据协议将字节数组拆分.对于有规律的重复拆分可以使用,由于java中不能像c中直接进行内存操作例如使用struc ...

  2. Class.getResourceAsStream() VS. ClassLoader.getResourceAsStream()

    For Class.getResourceAsStream(String name), if the name parameter doesn't start with a "/" ...

  3. SoapUI接口测试·第一个HTTP Request接口请求和断言

    一.新建SOAP项目 [File]-[New SOAP Project],在[Project Name]输入{工程名},点击[OK].   二.新建TestSuite 选中项目,右键选择[New Te ...

  4. ZooKeeper常见问题(转)

    这段时间来,也在和公司里的一些同学交流使用zk的心得,整理了一些常见的zookeeper问题.这个页面的目标是解答一些zk常见的使用问题,同时也让大家明确zk不能干什么.页面会一直更新. 客户端 1. ...

  5. Speed-BI 云平台视频观看频道

    数据分析的关键,首先是要有数据进行透视分析.大家一般在使用EXCEL透视表进行数据分析时,会通过某个系统,导出类似视频中的数据底稿,然后在此基础上进行各种维度的变换与指标的改变.奥威思必得也有一个类似 ...

  6. hadoop NameNode HA 和ResouceManager HA

    官网配置地址: HDFS HA : http://hadoop.apache.org/docs/current/hadoop-project-dist/hadoop-hdfs/HDFSHighAvai ...

  7. flock防止重复rsync

    我使用crontab同步一个文件夹时,发现一个问题,我在crontab中设置的1分钟运行一次.但当那个文件夹的内容改变时.1分钟不一定能同步完,但这时第二个rsync进行又起来了. 这个就产生一个问题 ...

  8. Swift游戏实战-跑酷熊猫 12 与平台的碰撞

    这节主要实现熊猫和平台的碰撞,实现熊猫在平台上奔跑 要点 对平台进行物理属性设置 //设置物理体以及中心点 self.physicsBody = SKPhysicsBody(rectangleOfSi ...

  9. Ways to access Oracle Database in PostgreSQL

    Today, organizations stores information(data) in different database systems. Each database system ha ...

  10. Dropbox能火,为何它的中国同行不能火?

    http://tech.163.com/15/0510/11/AP8II63H000915BF.html Dropbox能火,为何它的中国同行不能火? 2015-05-10 11:33:55 来源:  ...