1. 程式人生 > >bzoj3172【TJOI2013】單詞

bzoj3172【TJOI2013】單詞

3172: [Tjoi2013]單詞

Time Limit: 10 Sec  Memory Limit: 512 MB
Submit: 2178  Solved: 1012
[Submit][Status][Discuss]

Description

某人讀論文,一篇論文是由許多單片語成。但他發現一個單詞會在論文中出現很多次,現在想知道每個單詞分別在論文中出現多少次。

Input

第一個一個整數N,表示有多少個單詞,接下來N行每行一個單詞。每個單詞由小寫字母組成,N<=200,單詞長度不超過10^6

Output

輸出N個整數,第i行的數字表示第i個單詞在文章中出現了多少次。

Sample Input

3
a
aa
aaa

Sample Output

6
3
1

HINT

Source


AC自動機+遞推,思路很好(詳見程式)


#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<cstdlib>
#include<algorithm>
#include<queue>
#define F(i,j,n) for(int i=j;i<=n;i++)
#define D(i,j,n) for(int i=j;i>=n;i--)
#define ll long long
#define pa pair<int,int>
#define maxn 1000005
#define inf 1000000000
using namespace std;
int n,tot=1,cnt=0,t[maxn][26],go[maxn],w[maxn],a[maxn],p[205];
bool v[maxn];
char s[maxn];
queue<int> q;
inline void bfs()
{
	q.push(1);
	while (!q.empty())
	{
		int x=q.front(),y,j;q.pop();v[x]|=v[go[x]];
		a[++cnt]=x;//a陣列是按bfs順序生成的 
		F(i,0,25)
		{
			j=go[x];
			while (j&&!t[j][i]) j=go[j];
			if (t[x][i])
			{
				go[y=t[x][i]]=j?t[j][i]:1;
				q.push(y);
			}
			else t[x][i]=j?t[j][i]:1;
		}
	}
}
int main()
{
	scanf("%d",&n);
	F(i,1,n)
	{
		scanf("%s",s);
		int len=strlen(s),now=1;
		F(j,0,len-1)
		{
			int x=s[j]-'a';
			if (!t[now][x]) t[now][x]=++tot;
			now=t[now][x];
			w[now]++;
		}
		p[i]=now;//p陣列記錄了每個單詞結尾節點的位置 
	}
	bfs();
	D(i,cnt,1) w[go[a[i]]]+=w[a[i]];//這裡計算答案的方法很巧妙,相當於按bfs的反方向遞推 
	F(i,1,n) printf("%d\n",w[p[i]]);//這裡只要輸出w[p[i]]就可以了 
	return 0;
}


相關推薦

bzoj3172TJOI2013單詞

3172: [Tjoi2013]單詞 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 2178  Solved: 1012 [Submit][Sta

TJOI2013單詞(AC自動機)

題目描述 小張最近在忙畢設,所以一直在讀論文。一篇論文是由許多單片語成但小張發現一個單詞會在論文中出現很多次,他想知道每個單詞分別在論文中出現了多少次。 輸入輸出格式 輸入格式: 第一行一個整數N,表示有N個單詞。接下來N行每行一個單詞,每個單詞都由小寫字母(a-

NLP單詞糾錯——python小練習

起源 本文翻譯自大牛 Peter Norvig 的博文,作為本渣渣技術部落格的第一篇內容,熟悉一下這個部落格的操作哈~ 意思就是大牛自己的兩個大牛朋友問大牛,為什麼谷歌的拼寫檢查功能這麼厲害,大牛很驚訝,為什麼這麼厲害的兩個工程師+數學家竟然不懂這種

xsy1058 單詞 亂搞

++ efi 亂搞 個數 測試 暴力 情況 can col 題目大意:給你$n$個長度為$m$的字符串,字符集僅為{x,y,z}三個字符,定義兩個字符串$(s_i,s_j)$的相似度為$\sum_{k=1}^{m} [s_i[k]==s_j[k]]$。 從$0$到$m$詢

BZOJ3172單詞(AC自動機)

sca ++ include 很多 queue 有一點 div body ont 【BZOJ3172】單詞(AC自動機) 題面 Description 某人讀論文,一篇論文是由許多單詞組成。但他發現一個單詞會在論文中出現很多次,現在想知道每個單詞分別在論文中出現多少次。 I

BZOJ4567[Scoi2016]背單詞 Trie樹+貪心

字母 如果 ems scanf 序號 data scan name rdquo 【BZOJ4567】[Scoi2016]背單詞 Description Lweb 面對如山的英語單詞,陷入了深深的沈思,“我怎麽樣才能快點學完,然後去玩三國殺呢?&rdquo

c++LUOGU P1808 單詞分類

使用 排序 nbsp pan size pre 最短 include namespace STL大法好!!! 使用sort()將string排序,map去重並統計即可。 最短代碼如下: 1 #include<bits/stdc++.h> 2 using n

BZOJ3173: [Tjoi2013]最長上升子序列(樹狀數組)

nss 貢獻 isp 轉化 復雜 src printf efi col 【題意】給定ai,將1~n從小到大插入到第ai個數字之後,求每次插入後的LIS長度。 【算法】樹狀數組||平衡樹 【題解】 這是樹狀數組的一個用法:O(n log n)尋找前綴和為k的最小位置。(當數列

bzoj3173[Tjoi2013]最長上升子序列

isp ont const getch sed led hint 直接 close Description 給定一個序列,初始為空。現在我們將1到N的數字插入到序列中,每次將一個數字插入到一個特定的位置。每插入一個數字,我們都想知道此時最長上升子序列長度是多少? Inp

MapReduce實例單詞統計

clas e30 xor acdb pwc blog tar target xorg 鍁ye廢此比構es熱誓腔垂斯鞍燎拼烙傯煞6k略史熱http://blog.sina.com.cn/s/blog_17cbe977f0102x7sl.html裂jb焚諢時鉤df緞字靖琴悼放克

哈哈哈哈單詞

style ont width 平時 AD size cap lar table 平時英文題面看了很多詞,但都只是看了一眼就過了,於是決定記錄一下.... ● Vocabulary 1. colonisation 殖民化; 殖民; 定殖; 殖民地化; 2. met

LOJ#2078. 「JSOI2016」無界單詞

前綴 clu next 枚舉 時長 next數組 第k大 方案 遞推 ### 題解 用所有的方案減去有界的方案 我們規定兩個前綴後綴相同時長度最短的,設長度為l,因為長度最短所以他們也是無界單詞,可以遞推 $f[i] = \sum_{j = 1}^{\lfloor \f

HDU - 2072 單詞數(字串讀入技巧,sstream大法,水題,字串讀入格式)

題幹: lily的好朋友xiaoou333最近很空,他想了一件沒有什麼意義的事情,就是統計一篇文章裡不同單詞的總數。下面你的任務是幫助xiaoou333解決這個問題。 Input 有多組資料,每組一行,每組就是一篇小文章。每篇小文章都是由小寫字母和空格組成,沒有標點符號,遇到#時表示

練習題第九章--案例學習:單詞遊戲(Think Python)

在此強調一點: for i in range(1,5):     print(i) answer: 1 2 3 4 for i in range(5):     print(i) answer: 0 1 2 3 4

LeetCode151. 翻轉字串裡的單詞

題目連結:https://leetcode-cn.com/problems/reverse-words-in-a-string/description/ 題目描述 給定一個字串,逐個翻轉字串中的每個單詞。 示例 輸入: “the sky is blue”, 輸出: “bl

Luogu P3294 [SCOI2016]背單詞

閱讀理解題 。。。。。。   $Trie$字尾問題不好處理,我們把它轉化為字首問題,用字典樹解決問題貪心容易想到,一個串的字尾要先於它插入對於一個串和其若干字尾串,容易想到,我們要先插入字尾串然後遞迴進入$size$最小的子串 bool cmp(const int &x,c

leetcode 557. 反轉字串中的單詞 IIIEasy

題目: 給定一個字串,你需要反轉字串中每個單詞的字元順序,同時仍保留空格和單詞的初始順序。 示例 1: 輸入: “Let’s take LeetCode contest” 輸出: “s’teL ekat edoCteeL tsetnoc” 注意:在字串中,每個單詞由單個空格分隔,並且

LeetCode557. 反轉字串中的單詞 III

題目連結:https://leetcode-cn.com/problems/reverse-words-in-a-string-iii/description/ 題目描述 給定一個字串,你需要反轉字串中每個單詞的字元順序,同時仍保留空格和單詞的初始順序。 示例 輸入: “

LeetCode140. 單詞拆分 II結題報告 (C++)

原題地址:https://leetcode-cn.com/problems/word-break-ii/description/ 題目描述: 給定一個非空字串 s 和一個包含非空單詞列表的字典 wordDict,在字串中增加空格來構建一個句子,使得句子中所有的單詞都在詞典中。返回所有這些可能

English 程式設計師必備單詞

原文地址   application 應用程式 應用、應用程式   application framework 應用程式框架、應用框架 應用程式框架   architecture 架構、系統架構 體系結構   argument 引數(傳給函式的值)。叄見 parameter 叄數、實