心上人

【问题描述】 

人到初三,总会遇到情感问题,比方说小 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. SQL重要命令

    SQL对大小写不敏感:SELECT与select是相同的. SQL语句的分号:分号是在数据库系统中分隔每条 SQL 语句的标准方法,这样就可以在对服务器的相同请求中执行一条以上的 SQL 语句. SE ...

  2. c#上传文件(一)使用 .net 控件上传文件

    1.html代码: <body> <form id="form1" runat="server"> <div> <as ...

  3. 【Android Studio快捷键】之导入相应包声明(import packages)

    可能import 单个声明的快捷键大家都很容易找到,Alt+Enter.但是如果我要一次性import文件中所有的声明,这个快捷键是什么呢,找啊找的,就是没找到,以前在Eclipse是Ctrl+1,但 ...

  4. C++经典编程题#1:含k个3的数

    总时间限制:  1000ms 内存限制:  65536kB 描述 输入两个正整数 m 和 k,其中1 < m < 100000,1 < k < 5 ,判断 m 能否被19整除, ...

  5. LeetCode Single Number III

    原题链接在这里:https://leetcode.com/problems/single-number-iii/ 题目: Given an array of numbers nums, in whic ...

  6. BIND_MISMATCH导致过多VERSION COUNT的问题

    并不是用了绑定变量就一定都会游标共享,下面我们介绍的就是一种例子.BIND_MISMATCH导致VERSION COUNT过多的原因解释: This is due to the bind buffer ...

  7. SSH原理与运用(一)和(二):远程登录 RSA算法原理(一)和(二)

    SSH原理与运用(一)和(二):远程登录  RSA算法原理(一)和(二) http://www.ruanyifeng.com/blog/2011/12/ssh_remote_login.html ht ...

  8. 解决 SVN cleanup 任务中断导致无法 update

    解决 SVN cleanup 任务中断导致无法 update 今天在更新 svn 时, TortoiseSVN 一直在提示要进行 cleanup ,而执行 cleanup 时又提示: Cleanup ...

  9. nginx源码学习----内存池

    最近在进行监控平台的设计,之前一直觉得C/C++中最棘手的部分是内存的管理上,远不止new/delete.malloc/free这么简单.随着代码量的递增,程序结构复杂度的提高.各种内存方面的问题悄然 ...

  10. 使用代码创建AutoLayout约束

    使用代码创建AutoLayout约束 1.代码创建约束的步骤 2.代码创建约束的常用方法 3.代码创建约束的原则 4.禁用Autoresizing的原因 5. 设置相对状态栏的约束,使用self.to ...