心上人

【问题描述】 

人到初三,总会遇到情感问题,比方说小 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. (letcode)String to Integer (atoi)

    Implement atoi to convert a string to an integer. Hint: Carefully consider all possible input cases. ...

  2. django http 403 错误

    在使用android的xUtils框架提交post请求到django服务器上面,出现错误,返回Forbiddeen.解决方法记录于此. 参考链接 http://blog.csdn.net/liangp ...

  3. Failed to load PDF in chrome/Firefox/IE

    笔者的公司搭建了一个Nexus服务器,用来管理我们自己的项目Release构件和Site文档. 今天的问题是当用户访问一个Site里的PDF文件的时候,报错说“detected that the ne ...

  4. CSS:选择器大全

    一.概念: CSS主要的作用就是给网页中的dom元素设置样式,选择器则是用来匹配dom元素的. CSS中的选择器有很多种,常用的分别是标签选择器(根据元素标签名称),类选择器(根据元素class属性) ...

  5. saltstack之(三)认证管理

    salt-master和salt-minion之间需要进行认证,认证之后salt-master才能管理salt-minion. 1.在node1:[root@node1 ~]# egrep -v '^ ...

  6. 微信分享JS接口失效说明及解决方案

    关键字:微信分享 JS 失效  分享到朋友圈 微信分享JS接口目前已失效,以前可以自定义分享的标题.描述.图片.链接地址在微信6.0.2版本中失效. 官方回复如下: 旧版的获取分享状态及设置分享内容的 ...

  7. Android ListView与ExpandableListView设置分割线divider

    listview设置分割线需要以下操作: lv.setDivider(getResources().getDrawable(R.drawable.diyline)); ExpandableListVi ...

  8. Android --Activity与Fragment通讯

    参考博客:详解Fragment跟Activity之间的通信 Activity中方法 private OnSearchListener mSearchListener; /** *定义一个借口 **/ ...

  9. for循环计数

    1.巧用for循环计数,将文件每10行写到另一个文件,每遍历一行i就加1 with open('/etc/passwd') as f1, open('/tmp/passwd','w') as f2: ...

  10. android studio ,Gradle DSL method not found: 'compile()'

    用gradle构建android工程出现  Gradle DSL method not found: 'compile()' 错误 检查你外层的build.gradle文件中是不是用了compile方 ...