您的位置:首页 > 其它

(substr strstr 的学习) EOJ Monthly 2017.12 (暨 ECNU 12 月内部选拔) G1. 唐纳德与子串 (Easy)

2017-12-09 19:18 429 查看
substr :主要功能是复制子字符串,要求从指定位置开始,并具有指定的长度。如果没有指定长度_Count或_Count+_Off超出了源字符串的长度,则子字符串将延续到源字符串的结尾。例:string str  ,  temp;    temp= str.substr ( begin ,end );//含义为temp可以得到str从begin到end下标位置的字符数组

strstr    :   strstr(str1,str2) 函数用于判断字符串str2是否是str1的子串。如果是,则该函数返回str2在str1中首次出现的地址;否则,返回NULL。 

 子串的定义是在一个字符串中连续出现的一段字符。这里,我们使用 s[l…r] 来表示 s 字符串从 l 到 r(闭区间)的子串。在本题中,字符串下标从 0 开始。显然,对于长度为 n 的字符串共有 n(n+1)2 个子串。对于一个给定的字符串 s,唐纳德给出 q 次询问,第 i 次询问包括三个参数 li,ri,zi,问在 s[li…ri] 的所有子串中共有多少个恰好为 zi

Input
输入具有如下形式:sql1 r1 z1l2 r2 z2⋮lq rq zq第一行一个字符串 s。第二行一个整数 q。接下来每行:首先两个整数 li,ri (0≤li≤ri<|s|),然后是一个非空字符串 zi。整数和整数,整数和字符串间以单空格隔开。字符串中只会出现 26 个小写英文字母。数据规模约定:
对于 Easy 档:1≤|s|≤100,q≤∑|zi|≤100。

对于 Hard 档:1≤|s|≤105,q≤∑|zi|≤105。

Output
对于每次询问,输出一个整数,表示答案。

Examples

input
thisisagarbagecompetitionhahaha
5
0 30 a
1 5 is
25 30 hah
6 12 ag
7 12 ag
output
6
2
2
2


#include<iostream>
#include<string>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<iomanip>
#include<queue>
#include<cstring>
#include<map>
using namespace std;
typedef long long ll;
int main()
{
string str,z,temp;
int t;
cin>>str;
cin>>t;
while(t--)
{
int s,e,num=0;
cin>>s>>e>>z;
int len=z.length();
for(int i=s;i<=e-len+1;i++)
{
temp=str.substr(i,len);//长度
if(temp==z)
num++;
}
cout<<num<<endl;

}
return 0;
}
自己写的判断子串

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;

int main()
{
char s[105],z[105];
int q,l,r;
scanf("%s",s);
scanf("%d",&q);
int len=strlen(s);
while(q--)
{
scanf("%d %d %s",&l,&r,z);
int lz=strlen(z),cnt=0;
for(int i=l;i<=r-lz+1;i++)
{
int flag=0,k=i;
for(int j=0;j<lz;j++,k++)
{
if(s[k]!=z[j]){
flag=1;
break;
}
}
if(flag==0)
cnt++;
}
printf("%d\n",cnt);
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  字符串
相关文章推荐