Codeforces Round #725 (Div. 3) E. Funny Substrings(字符串小模拟)

Posted issue是fw

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces Round #725 (Div. 3) E. Funny Substrings(字符串小模拟)相关的知识,希望对你有一定的参考价值。

LINK

一个略微麻烦的小模拟

对于每个变量,存一下他本身有多少个 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)部分题解

Codeforces Round #725 (Div. 3) ABCDEFG题解

Codeforces Round #725 (Div. 3) 题解(A-G)