【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; }

相关文章
相关标签/搜索