⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 count1.cpp

📁 记数问题
💻 CPP
字号:
#include<iostream>
#include<fstream>
#include<string>
using namespace std;
ifstream in("input.txt");
ofstream out("output.txt");
class String
{
public:
	String(char *s="");
    void Build(char *s);
	~String();
	int Length() const;
	void Prefix();
	int Match(String& t);
private:
	char *str;
	int *pre;
	int size;
};
String::String(char *s)
{
	size=strlen(s)+1;
	str=new char[size];
	strcpy(str,s);
	pre=new int[size];
}
void String::Build(char *s)
{
	size=strlen(s)+1;
	str=new char[size];
	strcpy(str,s);
	pre=new int[size];
}
String::~String()
{
	delete[] str;
	delete[] pre;
}
int String::Length() const
{
	return size-1;
}
void String::Prefix()
{
	int m=Length();
	delete[] pre;
	pre=new int[m+1];
	pre[1]=0;
	int k=0;
	for(int i=2;i<=m;i++)
	{
		while((*(str+i-1)!=*(str+k))&&(k>0)) k=pre[k];
		if(*(str+i-1)==*(str+k)) pre[i]=++k;
		else pre[i]=0;
	}
}
int String::Match(String& t)
{
	int i=1,j=0;
	int num=0;
    int n=Length(),m=t.Length();
    t.Prefix();
    while((i<=n)&&(j<m))
	{
		if(str[i-1]==t.str[j])
		{
			i++;
			j++;
			if(j==m) 
			{
				num++;
				j=0;
			}
		}
		else
			if(j==0) i++;
			else j=t.pre[j];
	}
		
		return num;
}
void main()
{
	int num=0;
	String s,patten;
    char text[100],str[200],read[10000];
	in.getline(text,100);
    in.getline(str,200);
	patten.Build(str);
    ifstream fin(text);
	while(fin.getline(read,sizeof(read)))     
	{
		s.Build(read);
		num=num+s.Match(patten);
	}
	out<<num;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -