hihocoder #1052 : 基因工程(字符串处理 + 找规律 )

#1052 : 基因工程

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

描述

小Hi和小Ho正在进行一项基因工程实验。他们要修改一段长度为N的DNA序列,使得这段DNA上最前面的K个碱基组成的序列与最后面的K个碱基组成的序列完全一致。  

例如对于序列"ATCGATAC"和K=2,可以通过将第二个碱基修改为"C"使得最前面2个碱基与最后面两个碱基都为"AC"。当然还存在其他修改方法,例如将最后一个碱基改为"T",或者直接将最前面两个和最后面两个碱基都修改为"GG"。

小Hi和小Ho希望知道在所有方法中,修改碱基最少的方法需要修改多少个碱基。

输入

第一行包含一个整数T(1 <= T <= 10),代表测试数据的数量。

每组测试数据包含2行,第一行是一个由"ATCG"4个大写字母组成的长度为N(1 <= N <= 1000)的字符串。第二行是一个整数K(1 <= K <= N)。

输出

对于每组数据输出最少需要修改的碱基数量。

样例输入
2  

ATCGATAC  

2  

ATACGTCT

6 
样例输出
1  

3   


参考博客:http://beeder.me/2014/11/02/hihocoder-problem-1052-genetic-engineering/
#include <stdio.h>

#include <string.h>

#include <math.h>

#include <algorithm>



using namespace std;



int main()

{

	int t;

	int i, j;

	char s[1100];

	scanf("%d", &t);

	int k; int ans;



	while(t--)

	{

		scanf("%s", s);

		int len=strlen(s);

		scanf("%d", &k);

		ans=0;

		if(2*k <=len)

		{

			int dd=len-k;

			for(i=0; i<k; i++)

			{

				if(s[i]!=s[dd+i])

					ans++;

			}

		}

		else //有重合部分

		{

			int dd=len-k;

			for(i=0; i<dd; i++ )

			{

				int A=0, G=0, C=0, T=0; int num=0;

				for(j=i; j<len; j+=dd )

				{

					num++;

					if(s[j]=='A') A++;

					else if(s[j]=='G') G++;

					else if(s[j]=='C') C++;

					else T++;

				}

				int maxchar = max(A, G);

				maxchar = max(maxchar, C);

				maxchar = max(maxchar, T);

				ans=ans+(num-maxchar);

			}

		}

		printf("%d\n", ans );

	}

	return 0;

}

 

 
      

你可能感兴趣的:(字符串处理)