NOI 0107 26:字符串最大跨距

这里是一个究极瓜皮,十个小时才做出来…
这里是题干@http://noi.openjudge.cn/ch0107/26/
一道很明显的模拟题,一般都只要按照题干的流程就AC了

最最开始的代码(WA)

#include<bits/stdc++.h>
using namespace std;
int main(){char a1[330],a[310],b[20],c[20],z[20];int temp,flag=0,s=0,t1,t2,t3,t;cin>>a1;temp=strlen(a1);for(int i=0;i<temp;i++){if(a1[i]!=','){if(flag==0){a[s]=a1[i];s++;}if(flag==1){b[s]=a1[i];s++;}if(flag==2){c[s]=a1[i];s++;}}else{flag++;s=0;}}if(strstr(a,b)!=NULL&&strstr(a,c)!=NULL){t=strlen(a);t1=strlen(strstr(a,b));t3=strlen(c);t2=strlen(strstr(a,c));for(int i=0;i<t2-t3;i++){z[i]=a[t+i-t2+2];}z[t2-t3]='\0';while(strstr(z,c)!=NULL){t2=strlen(strstr(z,c));for(int i=0;i<t2-t3;i++){z[i]=a[t+i-t2+2];}z[t2-t3]='\0';}cout<<t1-t2-t3;}else cout<<"-1";return 0;
}

然后在经过了很久很久之后找出来的问题:

1、strstr的找位置的用法

代码里是用了strstr和strlen通过strstr输出的是从第一个找到的字符到数组结尾的字符串,然后用strlen来判断。**但是!!**这个方式是错的(应该)(具体的错误原因还在找希望大佬解答)
然后是正确用法:
strstr()-数组参数
例子:

char a[100],b[10];
int n=strstr(a,b)-a;//在a当中寻找第一个b字符串并输出位置

strstr的返回值为指针,然后a也是一个指针并指向a[0],然后相减就可以得到在a中的位置了
千万要记住!输出的位置是a[]的位置,可能是0的那种
PS:strstr()在找不到的时候会返回NULL;

2、一个非常非常低级的读题失误

在题干中可以看到要求s1,s2不能交叉
看看上面那段代码,就可以发现没有编写关于这个要求的代码
这个没什么好说的,直接加进去就可以了

3、关于数组初始化的问题

很明显在这里没有对数组进行任何初始化操作,不过这题里没有问题
于是打算放到下一次里凑字数

——————————————————————————————————————————————

然后是改了好久的之后的代码

#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <iomanip>
using namespace std;
int main(){char a1[330],a[310],ad[310],b[20],c[20],c1[20];memset(a,0,sizeof(a));//将a[]全部赋值为0memset(ad,0,sizeof(ad));memset(b,0,sizeof(b));memset(c,0,sizeof(c));int temp,flag=0,s=0,t1,t2,t3,t;gets(a1);temp=strlen(a1);for(int i=0;i<temp;i++){if(a1[i]!=','){if(flag==0){a[s]=a1[i];s++;}if(flag==1){b[s]=a1[i];s++;}if(flag==2){c[s]=a1[i];s++;}}else{if(flag==0)a[s]='\0';//将a数组的最后一个字符串之后加\0,也是strstr、strlen等函数的终止字符else if(flag==1)b[s]='\0';else if(flag==2)c[s]='\0';flag++;s=0;}}if(!strstr(a,b)||!strstr(a,c)){cout<<"-1"<<endl;return 0;}t=strlen(a);t1=strstr(a,b)-a;for(int i=0;i<t;i++){ad[i]=a[t-i-1];}ad[t]='\0';t3=strlen(c);for(int i=0;i<t3;i++){c1[i]=c[t3-i-1];}c1[t3]='\0';t2=strstr(ad,c1)-ad;if(t>=t1+t2+t3+strlen(b))cout<<t-t1-t2-t3-strlen(b)<<endl;else cout<<"-1"<<endl;return 0;
}

这一段代码就是上一段代码把前面的问题改掉,然后再加了一点点小小的变动

接着是找了一个大佬的代码

#include<iostream>
#include<stdio.h>
#include<string.h>
using namespace std;
char s[310],s1[20],s2[20],y[310],ss2[20];
int flag=0,l,r,len1,len2,res;
void f(){int len=strlen(s),k=0;for(int i=len-1;i>=0;i--){y[k++]=s[i];}y[k]='\0';len=strlen(s2),k=0;for(int i=len-1;i>=0;i--){ss2[k++]=s2[i];}ss2[k]='\0';
}
int main(){cin.getline(s,400,',');cin.getline(s1,20,',');cin.getline(s2,20);if(!strstr(s,s1)||!strstr(s,s2)){cout<<"-1"<<endl;return 0;}len1=strlen(s1);len2=strlen(s2);l=strstr(s,s1)-s;r=strstr(s,s2)-s;if(l+len1-1>=r){cout<<"-1"<<endl;return 0;}f();//把s翻转方便求s2最右边起始点r=strstr(y,ss2)-y;res=strlen(s)-l-len1-len2-r;cout<<res<<endl;
}

大佬和我不同的地方:

1、cin.getline

用cin会有一些的难受的地方,比如这题当中的要用,隔开两个输入量
就会变得很麻烦(具体多麻烦参考上面本菜鸡的代码)
但是!!这是一种全新的体验,只要三分钟你就能爱上这种感觉 cin.getline就可以完美解决这个问题
对于cin.getline的输入格式
cin.getline(保存的数组/参数,输入的个数,一个字符/数字/无)
PS:输入的个数最好为最大值,不然会出现一些因缺思厅的问题
当遇到这个字符/数字的时候cin.getline结束(不读入这个字符/数字并且在下次读入时也不会有这个字符/数字)当然无的话就可以当作一个cin(限制输入个数的)来用

2、函数

当在做一个模拟题的时候会发现自己会用到很多很多相同的代码或者把一坨放在main里面很难受
这时候运用函数就会舒服很多了(虽然在本质上没有区别,代码也不会变少)
同时这也可以更好地理解代码(只要在调用函数的地方来一个标注就ok了也不用上下翻看main)
PS:调用函数的时候会存在形参和实参的问题,解决的办法一种是指针,另一种就是这种粗暴的直接定义全局参数,这样在函数和main都可以使用了(指针…本着能不用就不用)

实在编不下去了并开始了结尾

emmmm第一次写博客,而且还是一个菜鸡,所以可能会存在各种学术问题或者逻辑表达问题
麻烦各位大佬多多指正,最后关注和谐,谋求发展 (来自于一个b站up主)。

NOI0107字符串最大跨距相关推荐

  1. AC日记——字符串最大跨距 openjudge 1.7 26

    26:字符串最大跨距 总时间限制:  1000ms 内存限制:  65536kB 描述 有三个字符串S,S1,S2,其中,S长度不超过300,S1和S2的长度不超过10.想检测S1和S2是否同时在S中 ...

  2. OpenJudge NOI 1.7 26:字符串最大跨距

    [题目链接] OpenJudge NOI 1.7 26:字符串最大跨距 [题目考点] 1. 字符串 2. string类 string s, s1; s.find(s1):查找s1在s中第一次出现的位 ...

  3. C++版本 26:字符串最大跨距

    26:字符串最大跨距 描述 有三个字符串S,S1,S2,其中,S长度不超过300,S1和S2的长度不超过10.想检测S1和S2是否同时在S中出现,且S1位于S2的左边,并在S中互不交叉(即,S1的右边 ...

  4. 【BUCTOJ训练:字符串最大跨距(Python)】

    题目描述: 有三个字符串S1,S2,S,其中S长度不超过300,S1和S2的长度不超过10.想检测S1和S2是否同时在S中出现,且S1位于S2的左边,并在S中互不交叉(即S1的右边界点在S2的左边界点 ...

  5. h0093. 字符串最大跨距

    有三个字符串S,S1,S2,其中,S长度不超过300,S1和S2的长度不超过10. 现在,我们想要检测S1和S2是否同时在S中出现,且S1位于S2的左边,并在S中互不交叉(即,S1的右边界点在S2的左 ...

  6. 字符串最大跨距(c++)

    有三个字符串 S,S1,S2,其中,S 长度不超过 300,S1 和 S2 的长度不超过 10. 现在,我们想要检测 S1 和 S2 是否同时在 S 中出现,且 S1 位于 S2 的左边,并在 S 中 ...

  7. 字符串最大跨距 (c++)

    有三个字符串 S,S1,S2S,S1,S2,其中,SS 长度不超过 300300,S1S1 和 S2S2 的长度不超过 1010. 现在,我们想要检测 S1S1 和 S2S2 是否同时在 SS 中出现 ...

  8. 1.7-26:字符串最大跨距

    总时间限制: 1000ms 内存限制: 65536kB 描述 有三个字符串S,S1,S2,其中,S长度不超过300,S1和S2的长度不超过10.想检测S1和S2是否同时在S中出现,且S1位于S2的左边 ...

  9. python练习题038:字符串最大跨距

    描述 有三个字符串S,S1,S2,其中,S长度不超过300,S1和S2的长度不超过10.想检测S1和S2是否同时在S中出现,且S1位于S2的左边,并在S中互不交叉(即,S1的右边界点在S2的左边界点的 ...

最新文章

  1. c++重载运算符_C/C++编程笔记:运算符重载丨重载C++中的New和Delete运算符
  2. 多线程方式实现Socket通信
  3. python硬件驱动_Python学习:计算机基础之计算机硬件
  4. 学Java可以看哪些书?6本Java书籍推荐
  5. How to test function module CRM_TERRMAN_BUILD_TERRATTRIB_B
  6. 计算机显卡960,2015显卡开年之作!NVIDIA GTX960首测
  7. nio的优势_BIO、NIO、AIO 介绍和适用场景分析
  8. Maven 编译打包时如何忽略测试用例
  9. c#调用javascript的方法,有Updatepanel的情况
  10. HTML5 — 知识总结篇《III》【文本元素】
  11. Unity编辑器扩展-基本界面编写
  12. 泰迪杯数据挖掘挑战赛—数据预处理(一)
  13. php显示服务器ipv6,php获取用户IPv4或IPv6地址的代码
  14. 橡皮擦的英语_英语单词这样写,老师想扣卷面分都难!(建议收藏学习)
  15. android 接口sign,[原创]小米APP登录接口env、envkey、sign、hash算法
  16. 不会“思维”只会“批判”,谨防网络舆论“怨妇化”
  17. 好用的在线画图工具processon
  18. 恒源云(GPUSHARE)_CV训练时容易忽视的数据标签问题
  19. 2010年F1大奖赛巴林揭幕战
  20. GPS北斗卫星主时钟(NTP网络时间服务器)技术参数详解

热门文章

  1. micropython刷固件
  2. CFS(完全公平调度)
  3. 6.824系统-分布式计算MapReduce模式
  4. 心雨中调用Discuz论坛IE6中代码出现乱码
  5. bulk es 删除_es数据导出导入(bulk篇)
  6. 六(1)、spark遇到的问题
  7. 云队友丨人生的管理,就是目标的管理——管理工具大盘点
  8. 夏津一中2021高考成绩查询,2021德州市地区高考成绩排名查询,德州市高考各高中成绩喜报榜单...
  9. 理解torch.einsum(‘ijk,ilk->ijl‘, a,b)
  10. 每日英语:Report: Chinese Consumers Increasingly Divided