字典树模板+洛谷P2580 于是他错误的点名开始了
題目:
題目背景
XS中學(xué)化學(xué)競(jìng)賽組教練是一個(gè)酷愛(ài)爐石的人。
他會(huì)一邊搓?duì)t石一邊點(diǎn)名以至于有一天他連續(xù)點(diǎn)到了某個(gè)同學(xué)兩次,然后正好被路過(guò)的校長(zhǎng)發(fā)現(xiàn)了然后就是一頓歐拉歐拉歐拉(詳情請(qǐng)見(jiàn)已結(jié)束比賽 CON900)。
題目描述
這之后校長(zhǎng)任命你為特派探員,每天記錄他的點(diǎn)名。校長(zhǎng)會(huì)提供化學(xué)競(jìng)賽學(xué)生的人數(shù)和名單,而你需要告訴校長(zhǎng)他有沒(méi)有點(diǎn)錯(cuò)名。(為什么不直接不讓他玩爐石。)
輸入格式
第一行一個(gè)整數(shù) nn,表示班上人數(shù)。
接下來(lái) nn 行,每行一個(gè)字符串表示其名字(互不相同,且只含小寫(xiě)字母,長(zhǎng)度不超過(guò) 50)。
第 n+2 行一個(gè)整數(shù) m,表示教練報(bào)的名字個(gè)數(shù)。
接下來(lái) m 行,每行一個(gè)字符串表示教練報(bào)的名字(只含小寫(xiě)字母,且長(zhǎng)度不超過(guò) 50)。
輸出格式
對(duì)于每個(gè)教練報(bào)的名字,輸出一行。
如果該名字正確且是第一次出現(xiàn),輸出 OK,如果該名字錯(cuò)誤,輸出 WRONG,如果該名字正確但不是第一次出現(xiàn),輸出 REPEAT。
輸入輸出樣例
輸入 #1
5
a
b
c
ad
acd
3
a
a
e
輸出 #1
OK
REPEAT
WRONG
說(shuō)明/提示
對(duì)于 40% 的數(shù)據(jù),n≤1000,m≤2000n\le 1000,m\le 2000n≤1000,m≤2000。
對(duì)于 70% 的數(shù)據(jù),n≤104n\le 10^4n≤104 ,m≤2×104m\le 2\times 10^4m≤2×104 。
對(duì)于 100% 的數(shù)據(jù),n≤104n\le 10^4n≤104 ,m≤105m≤10^5m≤105 。
分析:
就注意一點(diǎn)就可:數(shù)據(jù)要開(kāi)的大一點(diǎn),之前沒(méi)過(guò),還以為是因?yàn)樽值錁?shù)不夠優(yōu)T了,結(jié)果改下數(shù)據(jù)就過(guò)了。
字典樹(shù)水題。
AC代碼:
#include<bits/stdc++.h> using namespace std; const int M=1e6+10; int n,m,tot; string s; int vis[M]; int ch[M][30]; void build(string a){int l=a.size();int u=1;for(int i=0;i<l;i++){int c=a[i]-'a';if(!ch[u][c])ch[u][c]=++tot;u=ch[u][c];}vis[u]=1; } int query(string a){int l=a.size();int u=1;for(int i=0;i<l;i++){int c=a[i]-'a';if(!ch[u][c])return 0;u=ch[u][c];}int k=vis[u];if(vis[u]!=0)vis[u]++;return k; } int main(){cin>>n;tot=1;for(int i=0;i<n;i++){cin>>s;build(s);}cin>>m;for(int i=0;i<m;i++){cin>>s;int x=query(s);if(x==1) cout<<"OK"<<endl;else if(x>1) cout<<"REPEAT"<<endl;else cout<<"WRONG"<<endl;}return 0; } 創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的字典树模板+洛谷P2580 于是他错误的点名开始了的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 中药祛湿一般多久见效
- 下一篇: 01tire+洛谷P4551 最长异或路