题解 P1308 【统计单词数】

小金羊发一篇不一样的题解:
这个题解不是讲解法的,是讲算法的...
众所周知,string在中被定义为是类型,
这意味着我们可以将它作为int一样的类型使用。
并且还有神奇的加减法:

string str,str2;
str2="Hello!";
str=str2-'!'+' '+"world!";
cout<<str;

结果就是:Hello world!


类型例子:


string lowwers(string str)
{//手写字符串该小写,死记! 
	int len=str.size();
	for (int i=0;i<len;i++)
	{
		str[i]=(str[i]>=65&&str[i]<=90)?str[i]+32:str[i];
	}
	return str;
}

哇塞,这也就是说我们可以写一写不一样的函数了!


例子(输入):

string inputs()
{//输入,小写化,并且开头结尾加上' ' 
	string temp;
	getline(cin,temp);
	return ' '+lowwers(temp)+' ';
}

甚至说,我们可以进行堆排序:
传送:https://www.luogu.org/blog/jelly123/
Code:

string strsort(string str)
{
    int len=str.size();
    for (int temp=0;temp<len;temp++)
    {
        q2.push(str[temp]);
    }
    string str2="";
    for (int temp=0;temp<len;temp++)
    {
        char tempchar=q2.top();
        str2=str2+tempchar;
        q2.pop();
    }
    return str2;
}

整个把字符串堆排出来!
Code:

#include <bits/stdc++.h>
using namespace std;
priority_queue<string,vector<string>,greater<string> >q1;
//是的,你没有看错,
priority_queue<char,vector<char>,greater<char> >q2;
//由于小金羊不会其他排序,发一个堆排吧...
//话说字符串堆排是不是太玄学了...
//其实原理极其简单,入堆,出堆,返回,搞定。
//然后做一个字符串的整体的堆排,就OK了。 
int n,count=1;
//整体变量
string strsort(string str)
{//字符串堆排,真玄学 
    int len=str.size();
    for (int temp=0;temp<len;temp++)
    {
        q2.push(str[temp]);
    }
    string str2="";//把要生成的字符串变成空的 
    for (int temp=0;temp<len;temp++)
    {
        char tempchar=q2.top();
        str2=str2+tempchar;
        q2.pop();
    }//生成完毕 
    return str2;//返回排好序的字符串 
}
int main()
{
    scanf("%d",&n);
    if (n==1){putchar('1');return 0;}
    //一个字符串还能有多少种啊 
    string strs[n+1];
    //第一个字符串就不要了 
    for (int i=1;i<=n;i++)
    {cin>>strs[i];strs[i]=strsort(strs[i]);}
    //输入,并且对单个字符串排序 
    for (int i=1;i<=n;i++)
    {q1.push(strs[i]);}
    string strtemp=q1.top();q1.pop();
    for (int i=1;i<n;i++)
    {
        string temp=q1.top();q1.pop();
        if (temp!=strtemp){count++;}
        strtemp=temp;
    }
    printf("%d",count);
    return 0;
}

返回这个题,解:

#include <iostream>
#include <cstdio>
#include <string>
using namespace std;
string lowwers(string str)
{//手写字符串该小写,死记! 
	int len=str.size();
	for (int i=0;i<len;i++)
	{
		str[i]=(str[i]>=65&&str[i]<=90)?str[i]+32:str[i];
	}
	return str;
}
string inputs()
{//输入,小写化,并且开头结尾加上' ' 
	string temp;
	getline(cin,temp);
	return ' '+lowwers(temp)+' ';
}
int main()
{
	string pas,goal;
	int pos=0,count=0,memory;//定位器 
	goal=inputs();
	pas=inputs();
	pos=pas.find(goal,pos);
	if (pos==-1)
	{
		cout<<pos;
		return 0;
	}
	else
	{
		memory=pos;count++;
		pos+=goal.size()-1;
	}
	while (pos<pas.size())
	{
		pos=pas.find(goal,pos);
		if (pos==-1)
		{
			break;
		}
		else
		{
			count++;
			pos=pos+goal.size()-1;
		}
	}
	cout<<count<<' '<<memory;
	return 0;
}

完成,善莫大焉!

原文地址:https://www.cnblogs.com/jelly123/p/10385918.html