Codeforces Round #725 (Div. 3) E. Funny Substrings(字符串小模拟)
Posted issue是fw
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces Round #725 (Div. 3) E. Funny Substrings(字符串小模拟)相关的知识,希望对你有一定的参考价值。
一个略微麻烦的小模拟
对于每个变量,存一下他本身有多少个 h a h a haha haha串
考虑两个串拼接,多产生的 h a h a haha haha串只可能在中间的拼接部分,所以额外存一下前 3 3 3个字母和后 3 3 3个字母即可
使用 m a p map map存每个变量的信息
#include <bits/stdc++.h>
using namespace std;
#define int long long
int t,n;
//开头字母是
//最后一个字母是
struct p
{
string l,r;
int w;
};
map<string,p>mp;
string aim = "haha";
string get(string s,int l,int r)
{
string ans = "";
for(int i=l;i<=r;i++) ans += s[i];
return ans;
}
p trans(string s)
{
int ans = 0,len = s.length();
for(int i=3;i<len;i++)
if( get(s,i-3,i)==aim ) ans++;
if( len<3 ) return p{s,s,ans};
else return p{get(s,0,2),get(s,len-3,len-1),ans};
}
p merge(p a,p b)
{
string s = a.r+b.l, L = "", R = "";
int ans = a.w+b.w, len = s.length();
for(int i=3;i<len;i++)
if( get(s,i-3,i)==aim ) ans++;
string now = a.l+b.l; int le = now.length();
L = get(now,0,min(2ll,le) );
now = a.r+b.r; int re = now.length();
R = get(now,max(0ll,re-3),re-1);
return p{L,R,ans};
}
signed main()
{
cin >> t;
while( t-- )
{
cin >> n; getchar();
for(int i=1;i<=n;i++)
{
char c = getchar(); string now = "";
while( c!='\\n' )
{
now += c; c = getchar();
}
int j = 0;
for(;j<now.length();j++)
if( now[j]==' ' ) break;
string las = get(now,0,j-1);//开头的变量
if( now[j+1]==':' )//基本的赋值操作
mp[las] = trans( get(now,j+4,now.length()-1) );
else
{
int l = j+3; j += 3;
for(;j<now.length();j++)
if( now[j]==' ' ) break;
string ls = get(now,l,j-1), rs = get(now,j+3,now.length()-1 );
mp[las] = merge( mp[ls],mp[rs] );
}
if( i==n ) cout << mp[las].w << endl;
}
mp.clear();
}
}
/*
b := aha
c = a + b
*/
以上是关于Codeforces Round #725 (Div. 3) E. Funny Substrings(字符串小模拟)的主要内容,如果未能解决你的问题,请参考以下文章
Codeforces Round #725 (Div. 3)Codeforces-1538
Codeforces Round #725 (Div. 3)Codeforces-1538
Codeforces Round #725 (Div. 3)Codeforces-1538
Codeforces Round #725 (Div. 3)部分题解