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


猜你喜欢

转载自blog.csdn.net/qq_36914923/article/details/80231925