c-英语作文(牛客新生赛)
题目描述
在写英语作文的时候,两个相同单词靠的太近肯定不好。现在 ZHR 给了你一段nnn个单词的英文,问你有多少对相同单词中间间隔的单词数小于等于kkk 。
输入描述:
第一行两个整数,为nnn 和 kkk 。
第二行nnn个由仅小写字母组成的单词。每个单词长度小于等于101010 。
1≤k≤n≤1051le k le n le 10^51≤k≤n≤105。
输出描述:
一行一个正整数,表示有多少对单词中间间隔的单词数小于等于kkk 。
示例1
输入
复制11 2 i love you you love mi mixue ice cream and tea
11 2 i love you you love mi mixue ice cream and tea
输出
复制2
2
说明
只有 you 和 love 两个单词间隔的单词数小于等于222
示例2
输入
复制10 2 a a a a a a a a a a
10 2 a a a a a a a a a a
输出
复制24
24
思路:用map<string,vector<int> >,一个存他的单词,一个存他的下标,把他的下标存进vector里。在加入一个数的下标i前先判断他的vector数组里有没有数,如果有,说明前面有与他相同的单词,就找到他最左能到的下标i-k+1这个数在vector数组中的下标,然后用他最右边的数的下标减去他最左能到的下标,就是能与他配对的个数。
注意:最后结果用longlong存,如果用int只能通过百分之九十的实例。
#include<iostream> #include<vector> #include<algorithm> #include<map> using namespace std; int main(){ int n,k; long long con=0; scanf("%d%d",&n,&k); map<string,vector<int> > a; for(int i=1;i<=n;i++){ string s; cin>>s; if(a[s].size()!=0){ int q=lower_bound(a[s].begin(),a[s].end(),i-k-1)-a[s].begin(); con+=a[s].size()-q; } a[s].push_back(i); } printf("%lld",con); return 0; }
上一篇:
IDEA上Java项目控制台中文乱码