【CSP-S膜你考】不怕噩夢 (模擬)

不怕噩夢

題面

蚊子最近常常作噩夢,而後就會被嚇醒。這可很差。。ios

瘋子一直在發愁,而後忽然有一天,他發現蚊子其實就是懼怕某些事。code

若是那些事出如今她的夢裏,就會懼怕。ci

咱們能夠假定那個懼怕的事實際上是一個字符串。而她作的夢其實也是一個字符串。字符串

她能夠一個晚上一直作夢,因此夢這個字符串會很長,若是其中包含了她所懼怕的事情,那麼她這天晚上就會懼怕。get

固然一個懼怕的事也可能在這天晚上被她夢到不少遍,固然每一個晚上也可能有不少種懼怕的事都被夢到。input

每一個懼怕的事都有必定的權值。string

而這天晚上若是夢到了某件事,那麼這件事所產生的黑暗效果等於這件事的權值乘以這個懼怕的事在夢字符串裏的開始位置。it

若是一樣的事夢到了不少遍,那麼就重複上面的操做不少遍。io

當天晚上的黑暗效果總和等於當天全部懼怕的事產生的黑暗效果累加到一塊兒。stream

如今瘋子想知道蚊子這些天來噩夢的黑暗效果總和是多少。

輸入格式

第$1$行兩個整數$N,M$表明一共有$N$天夢和$M$個懼怕的事。

第$2$行到第$M+1$行。每行一個字符串$t_i$,表明第$i$個懼怕的事

第$M+2$行到第$2M+2$行。每行一個整數$a_i$.表明第$i$個懼怕的事權值

第$2M+3$行到第$N+2M+3$行。每行一個字符串$s_i$,表明第$i$天的夢。

輸出格式

$SUM $

$SUM=N$天裏黑暗效果的總和。

咱們保證天天的黑暗效果都小於$\texttt{maxlongint}$;

樣例

$\texttt{input#1}$
2 2
abc
def
1
2
abcdef
defabc

$\texttt{output#1}$
15

數據範圍與提示

【樣例解釋】

$1 * 1 + 2 * 4 + 1 * 4 + 2 * 1 = 15$

對於數據的把握和時間複雜度的估計是成敗的關鍵。

若是出現一個夢是:ab

而懼怕的事有a,b,ab,那麼a,b,ab都須要參與計算..
【數據範圍】

對於$30 % $的數據

$N,M \leqslant 50$

對於全部的數據
$N<=200.M<=200. length(s_i)<=200.length(t_i)<=200.a_i<=10.$


題解

str1.find(str2,qwq)是從str1的qwq位置開始找str2找到的話返回str2在str1中的從qwq位置開始第一次出現的位置。模擬便可。


$Code$

```cpp

include

include

include

include

include

typedef long long ll;
ll ans,n,m;
std::string sss[201];
struct aaa {
std::string name;
ll w;
}a[201];

inline void read(ll &T) {
ll x=0;bool f=0;char c=getchar();
while(c<'0'||c>'9'){if(c=='-')f=!f;c=getchar();}
while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}
T=f?-x:x;
}

inline void calc(int a,int b) {
ans+=a*b;
}

int main() { read(n),read(m); for(int i=1;i<=m;++i) { std::cin>>a[i].name; } for(int i=1;i<=m;++i) { read(a[i].w); } for(int i=1;i<=n;++i) { std::cin>>sss[i]; } for(int i=1;i<=n;++i) { for(int j=1;j<=m;++j) { int x=0; while(1) { x=sss[i].find(a[j].name,x); if(x==-1) break; else calc(x+1,a[j].w); x++; } } } std::cout<<ans<<'\n'; return 0; }

相關文章
相關標籤/搜索