hihoCoder #1400 : Composition


#1400 : Composition

时间限制: 10000ms
单点时限: 1000ms
内存限制: 256MB

描述

Alice writes an English composition with a length of N characters. However, her teacher requires that M illegal pairs of characters cannot be adjacent, and if 'ab' cannot be adjacent, 'ba' cannot be adjacent either.

In order to meet the requirements, Alice needs to delete some characters.

Please work out the minimum number of characters that need to be deleted.

输入

The first line contains the length of the composition N.

The second line contains N characters, which make up the composition. Each character belongs to 'a'..'z'.

The third line contains the number of illegal pairs M.

Each of the next M lines contains two characters ch1 and ch2,which cannot be adjacent.  

For 20% of the data: 1 ≤ N ≤ 10

For 50% of the data: 1 ≤ N ≤ 1000  

For 100% of the data: 1 ≤ N ≤ 100000, M ≤ 200.

输出

One line with an integer indicating the minimum number of characters that need to be deleted.

样例提示

Delete 'a' and 'd'.

样例输入
5
abcde
3
ac
ab
de
样例输出
2

题意:给一个长度为N的字符串,有M对相邻字符不合法,正反都不能出现在字符串中,问最少去掉多少个字符,才能满足符合约束条件的字符串。

题解:逆向思维,最多保留多少个字符f[25],用N减去f[25]就是最少减去的字符数。f[25]因为都是小写字母,最优的情况只用判断‘a’-'z'最后一次出现的位置就行,因为之前出现了一定小于等于最后一次可以最多可以保留的字符个数

#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
int g[27][27];
int n,m;
char s[100005],c1[3];
int f[30];

int main()
{
	while(~scanf("%d\n%s",&n,s))
	{
		memset(f,0,sizeof(f));
		memset(g,0,sizeof(g));
		scanf("%d",&m);
		for(int i=0;i<m;i++)
		{
			scanf("%s",c1);
			g[c1[0]-'a'][c1[1]-'a']=1;
			g[c1[1]-'a'][c1[0]-'a']=1;
		}
		for(int i=0;i<n;i++)
		{
			int id=s[i]-'a';
			int tmp=1;
			for(int j=0;j<26;j++)
			{
				if(!g[id][j])//当前位置合法
				tmp=max(tmp,f[j]+1); //可以保留的字符个数 
			}
			f[id]=tmp;
		}
		sort(f,f+26);
		printf("%d\n",n-f[25]);
	}
	return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值