Luogu P8195 [传智杯 #4 决赛] 小智的疑惑题解

我在尝试美化

题目

题目描述

        传智专修学院给了小智一个仅包含小写字母的字符串 s,他想知道,里面出现了多少次子串 chuanzhi 呢。

        我们称一个字符串 t 是 s 的子串,当且仅当将 s 的开头若干个(可以为 0 个)连续字符和结尾若干个(可以为 0个)连续字符删去后,剩下的字符串和 t 相同。例如,我们称 ab 是 abc 的子串,但 ac 不是 abc 的子串。


输入格式

        输入只有一行一个字符串,表示字符串 s


输出格式

        输出一行一个整数表示答案。


输入输出样例

输入 #1

welcometochuanzhicupchuanzhi

输出 #1

2

题解

这道题的思路非常简单,其实只用把每个长度为8的字符串求出来匹配就行了,在c++的string类型中,有个库函数substr(int , int),可以取从第一个int开始的连续第二个int的长度的个数。

那么,我们就可以用这个函数,O(n)求解出答案


话不多说,上代码(无注释版本,请放心使用)

#include <bits/stdc++.h>
#pragma GCC optimize(1 , 2 , 3 , "Ofast" , "inline")
#define ll long long
using namespace std;
const int N = 5e5 + 5;
string str;
string s[400005];
void solve()
{
	cin >> str;
	int l = str.size();
	s[1] = str.substr(0 , 8);
	for (int i = 8 ; i < l ; i++)
	{
		s[i - 6] = s[i - 7].substr(1 , 7) + str[i];
	}
	
	int ans = 0;
	for (int i = 1 ; i <= l - 6 ; i++)
	{
//		cout << s[i] << '\n'; 
		if (s[i] == "chuanzhi")
		{
			ans++;
		}
	}
	
	cout << ans;
	return ;
}
int main()
{
	int T = 1;
//	cin >> T;
	while (T--)solve();
	return 0;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值