NYOJ 661 亲亲串

亲亲串

时间限制:1000 ms  |  内存限制:65535 KB

难度:3

描述

如果有一个字符串,它的前半段等于它后半段,例如 abcabc,我们就叫这种字符串为“亲亲串”。

现在给你一个字符串(仅有大小写字母组成),可以在任意的位置添加任意个字符,使这个字符串成为一个“亲亲串”,最少需要添加多少个字符?

输入
第一行是一个整数N(0<N<=1000),表示有N组测试数据。

接下来有N行,每行有一个字符串,字符串的长度小于1000;

输出
对于每组测试数据输出一个整数,为最小添加字符数
样例输入
3
abcbc
aaaab
abcd
样例输出
1
1
4
错误代码!不知道为什么提交不成功,请路过大神指点!
#include<stdio.h>
#include<string.h>
char str[1005],stack1[1005],stack2[1005];
int main()
{
	int T,i,j,count,top1,top2;
	scanf("%d",&T);
	while(T--)
	{
		scanf("%s",str);
		count=top1=top2=0;
		memset(stack1,0,sizeof(stack1));
		memset(stack2,0,sizeof(stack2));
		for(i=0;str[i]!=‘\0‘;i++)
		{
			if(top1==top2)
			{
				stack1[top1]=str[i];
				top1++;
			}
			else
			{
				for(j=top2;j<top1;j++)
				{
					if(str[i]==stack1[j])
					{
						count+=(j-top2);
						stack2[j]=str[i];
						top2=j+1;
						break;
					}
				}
				if(j>=top1)
				{
					stack1[top1]=str[i];
					top1++;
				}
			}
		}
		count+=(top1-top2);
		printf("%d\n",count);
	}
	return 0;
}

AC码:

#include<stdio.h>
#include<string.h>
char str[1005];
int dp[1005],len;
int fun(int t)
{
	int i,j,a,b;
	memset(dp,0,sizeof(dp));
	for(i=0;i<t;i++)
	{
		a=0;
		for(j=t;j<len;j++)
		{
			b=dp[j+1];
			if(str[i]==str[j])
				dp[j+1]=a+1;
			else if(dp[j]>dp[j+1])
				dp[j+1]=dp[j];
			a=b;
		}
	}
	return dp[len];
}
int main()
{
	int T,i,max,t;
	scanf("%d",&T);
	while(T--)
	{
		scanf("%s",str);
		len=strlen(str);
		max=fun(len/2);
		if(max==len/2)
		{
			printf("%d\n",len-2*max);
			continue;
		}
		for(i=max;i+max<len;i++)
		{
			t=fun(i);
			if(t>max)
				max=t;
		}
		printf("%d\n",len-2*max);
	}
	return 0;
}

NYOJ 661 亲亲串

时间: 2024-10-30 03:06:02

NYOJ 661 亲亲串的相关文章

NYOJ 44 字串和

子串和 时间限制:5000 ms  |  内存限制:65535 KB 难度:3 描述 给定一整型数列{a1,a2...,an},找出连续非空子串{ax,ax+1,...,ay},使得该子序列的和最大,其中,1<=x<=y<=n. 输入 第一行是一个整数N(N<=10)表示测试数据的组数) 每组测试数据的第一行是一个整数n表示序列中共有n个整数,随后的一行里有n个整数I(-100=<I<=100),表示数列中的所有元素.(0<n<=1000000) 输出 对于

NYOJ 252 01串(斐波那契数列变形)

01串 时间限制:1000 ms  |  内存限制:65535 KB 难度:2 描述 ACM的zyc在研究01串,他知道某一01串的长度,但他想知道不含有“11”子串的这种长度的01串共有多少个,他希望你能帮帮他. 注:01串的长度为2时,有3种:00,01,10. 输入 第一行有一个整数n(0<n<=100),表示有n组测试数据;随后有n行,每行有一个整数m(2<=m<=40),表示01串的长度; 输出 输出不含有“11”子串的这种长度的01串共有多少个,占一行. 样例输入 2

NYOJ 44 字串和 (最大字串和 线性dp)

题目链接: http://acm.nyist.edu.cn/JudgeOnline/problem.php?pid=44 子串和 时间限制:5000 ms  |  内存限制:65535 KB 难度:3 描述 给定一整型数列{a1,a2...,an},找出连续非空子串{ax,ax+1,...,ay},使得该子序列的和最大,其中,1<=x<=y<=n. 输入 第一行是一个整数N(N<=10)表示测试数据的组数) 每组测试数据的第一行是一个整数n表示序列中共有n个整数,随后的一行里有n个

逗比做题

NYOJ  (01串) 我非要用递归,我非要用记忆化搜索 1 #include<stdio.h> 2 #include<string.h> 3 4 int N; 5 int a[100][2]; 6 7 int solve(int i, int tem) 8 { 9 if(i==N) 10 { 11 if(tem==0) 12 return 2; 13 else 14 return 1; 15 } 16 if(a[i][tem]>=0) 17 return a[i][tem]

nyoj 37回文串

述所谓回文字符串,就是一个字符串,从左到右读和从右到左读是完全一样的,比如"aba".当然,我们给你的问题不会再简单到判断一个字符串是不是回文字符串.现在要求你,给你一个字符串,可在任意位置添加字符,最少再添加几个字符,可以使这个字符串成为回文字符串. 输入 第一行给出整数N(0<N<100)接下来的N行,每行一个字符串,每个字符串长度不超过1000. 输出 每行输出所需添加的最少字符数 dp[i][j]=dp[i+1][j] s[i]==s[j]            

NYOJ 752 又见回文串

又见回文串 时间限制:1000 ms  |  内存限制:65535 KB 难度:2 描述 回文串"是一个正读和反读都一样的字符串,比如"level"或者"noon"等等就是回文串.今天,PIAOYI又遇见一个关于字符串的题:两人玩一个游戏,给一个字符串,两人轮流删除字符串中的任意一个字符,当某人删除字符后,若该字符串可以经过重新整理后是一个回文串,则他获胜.当两人足够聪明均不出现操作失误的情况,先手是否可以获胜. 输入 多组测试数据,输入一个字符串(所有字

NYOJ 1023 还是回文(DP,花最少费用形成回文串)

1 /* 2 题意:给出一串字符(全部是小写字母),添加或删除一个字符,都会产生一定的花费. 3 那么,将字符串变成回文串的最小花费是多少呢? 4 5 思路:如果一个字符串增加一个字符 x可以形成一个回文串,那么从这个字符串中删除这个字符 x 6 同样也能形成回文串! 7 所以我们只记录删除,和增加这个字符 x 的最小的费用就好了!->转变成添加多少个字符形成回文串费用最少! 8 9 str[i]!=str[k] 10 dp[i][j]=min(dp[i][j-1]+cost[str[k]-'a

nyoj 01串 (DP)

01串 时间限制:1000 ms  |  内存限制:65535 KB 难度:2 描述 ACM的zyc在研究01串,他知道某一01串的长度,但他想知道不含有"11"子串的这种长度的01串共有多少个,他希望你能帮帮他. 注:01串的长度为2时,有3种:00,01,10. 输入 第一行有一个整数n(0<n<=100),表示有n组测试数据; 随后有n行,每行有一个整数m(2<=m<=40),表示01串的长度; 输出 输出不含有"11"子串的这种长度的

nyoj 44-子串和(子串和最大问题)

44-子串和 内存限制:64MB 时间限制:5000ms Special Judge: No accepted:12 submit:48 题目描述: 给定一整型数列{a1,a2...,an},找出连续非空子串{ax,ax+1,...,ay},使得该子序列的和最大,其中,1<=x<=y<=n. 输入描述: 第一行是一个整数N(N<=10)表示测试数据的组数) 每组测试数据的第一行是一个整数n表示序列中共有n个整数,随后的一行里有n个整数I(-100=<I<=100),表示