列表

详情


NC50356. 单词

描述

某人读论文,一篇论文是由许多单词组成。但他发现一个单词会在论文中出现很多次,现在想知道每个单词分别在论文中出现多少次。

输入描述

第一个一个整数N,表示有多少个单词,接下来N行每行一个单词。

输出描述

输出N个整数,第i行的数字表示第i个单词在文章中出现了多少次。

示例1

输入:

3
a
aa
aaa

输出:

6
3
1

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++14(g++5.4) 解法, 执行用时: 901ms, 内存消耗: 11580K, 提交时间: 2019-12-12 19:19:59

#include <bits/stdc++.h>
using namespace std;

const int MAXN = 1e6+300;
const int P = 1e9+7;
int H[MAXN];
int B[MAXN];
string s;
int gao(string &w) {
  int cnt = 0;
  int h = 0; for (auto c: w) h = h * P + c;
  for (int i = 0; i < s.size(); i++) {
    H[i+1] = H[i] * P + s[i];
    int j = i - int(w.size());
    if (j >= 0) {
      H[i+1] -= s[j] * B[w.size()];
    }
    if (H[i+1] == h) cnt++;
  }
  return cnt;
}
int main() {
  ios::sync_with_stdio(false);
  int N; cin >> N;
  vector<string> words(N); for (auto &w: words) cin >> w;
  for (auto &w: words) s.append("#"), s.append(w);
  // for (int i = 0; i < s.size(); i++) H[i+1] = H[i] * P + s[i];
  B[0] = 1;
  for (int i = 0; i < s.size(); i++) B[i+1] = B[i] * P;

  for (auto &w: words) cout << gao(w) << endl;
}

C++11(clang++ 3.9) 解法, 执行用时: 501ms, 内存消耗: 10484K, 提交时间: 2020-03-05 14:29:54

#include<bits/stdc++.h>
using namespace std;
const int MAXN=1e6+300;
const int P=1e9+7;
int H[MAXN];
int B[MAXN];
string s;
int gao(string &w)
{
	int cnt=0;
	int h=0;
	for(auto c:w) h=h*P+c;
	for(int i=0;i<s.size();i++)
	{
		H[i+1]=H[i]*P+s[i];
		int j=i-int(w.size());
		if(j>=0)
		{
			H[i+1]-=s[j]*B[w.size()];
			
		}
		if(H[i+1]==h) cnt++;
	}
	return cnt;
}
int main()
{
	ios::sync_with_stdio(false);
	int N;
	cin>>N;
	vector<string> words(N);
	for(auto &w:words) cin>>w;
	for(auto &w:words) s.append("#"),s.append(w);
	B[0]=1;
	for(int i=0;i<s.size();i++) B[i+1]=B[i]*P;
	for(auto &w:words) cout<<gao(w)<<endl;
}

上一题