map典例 hdoj 1251 统计难题
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n,i,j,k,t;
string b;
char a[52];
map<string,int>m;
while(gets(a))
{
if(a[0]=='\0') break;
t=strlen(a);
string b;
for(i=0;i<t;i++)
{
b=b+a[i];
m[b]++;
}
}
while(cin>>b)
{
cout<<m[b]<<endl;
}
return 0;
}
一个典型的map的用法,之前做是可以用substr来截取前缀,这次的思路更加巧妙,直接把第一个到最后一个都挑出来一次,因为如果挑到相同的继续加一就行了,所以不存在覆盖不了的问题。
这个也相当于线遍历枚举一次,将每一次输进来的单词都把长度算一下,然后从头开始枚举(因为字符串截取的时候就是从头开始截取的,后面给出来的都是前缀,就很骚气),然后由map从string到int,这块一定要想明白,不是因为有两个字符串的处理就是两个string,而是字符串对应的目标值为int,然后将map类似数组使用,遇到一个串就自增一次,这时候内部重新定义了一下string b就相当于初始化了一下,避免它带了之前的值。然后map不用初始化,开始本身就是0,从0开始算的。碰见换行就要停止,不然gets会一直进行输入,不停(用cin不行)