列表

详情


NC208011. 古代遗迹:字符王国

描述

小梁在前往橘子群岛的旅途中,偶然遇到了一个超古代遗迹,遗迹内的宝可梦都是文字大师,想要收服他们,必须正确回答他们的问题才行。
现在,宝可梦A给了小梁两个英文串 ,允许小梁可以任意次数的对字符串T改变其顺序生成新字符串, 那么在中有多少个子串至多改变一个字符,可以和完全匹配。
聪明的你是否可以帮助小梁解决这个问题,成功收服宝可梦?

输入描述

第一行输入一个
每组数据的包括两行:
第一行输入字符串
第二行输入字符串
保证所有字符串都只有小写英文字母,并且
(注:|S| 表示的是字符S的长度)

输出描述

输出行,每行一个整数,表示中有多少个符合要求的子串。

示例1

输入:

2
acdccbdcaabddcd
caaa
adfejitgf
yy

输出:

2
0

说明:

第一组样例中:

\text{S}的子串\text{caab}可以和\text{Tx = caaa}匹配。

\text{S}的子串\text{dcaa}可以和\text{Tx = acaa}匹配。

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++14(g++5.4) 解法, 执行用时: 152ms, 内存消耗: 912K, 提交时间: 2020-06-20 17:06:24

#include<bits/stdc++.h>
using namespace std;
int N;
string s, t;
bool judge(int *s, int* t)
{
	int sum = 0;
	for(int i = 'a'; i <= 'z'; i++)
		sum += abs(s[i]-t[i]);
	return sum <= 2;
}
int main()
{
	for(cin >> N; N--; )
	{
		cin >> s >> t;
		int cnts[256] = {0}, cntt[256] = {0}, i, ans = 0, len = t.size();
		for(i = 0; t[i]; i++)
			cntt[t[i]]++, cnts[s[i]]++;
		ans += judge(cnts, cntt);
		for(; s[i]; i++)
		{
			cnts[s[i-len]]--;
			cnts[s[i]]++;
			ans += judge(cnts, cntt);
		}
		cout << ans << endl;
	}
	
}

C++11(clang++ 3.9) 解法, 执行用时: 27ms, 内存消耗: 732K, 提交时间: 2020-06-22 22:46:35

#include<bits/stdc++.h>
using namespace std;

char R[200005],T[200005];
int main()
{
    int i,j,k,t,n,m;
    scanf("%d",&t);
    while(t--)
    {
    	scanf("%s%s",R,T),n=strlen(R),m=strlen(T);
    	int V[26]={0},ans=0;
    	for(i=0;i<m;i++)V[T[i]-'a']++,V[R[i]-'a']--;
    	for(k=j=0;j<26;j++)if(V[j])k+=abs(V[j]);
    	if(k<3)ans++;
    	for(i=m;i<n;i++)
		{
			V[R[i]-'a']--,V[R[i-m]-'a']++;
			for(k=j=0;j<26;j++)if(V[j])k+=abs(V[j]);
    	    if(k<3)ans++;
		}
		printf("%d\n",ans);
	}
}

上一题