模拟赛
串(string)
【题目描述】
给定一个由小写字母组成的字符串 s,每次你可以删去它的一个非回文子串,
求删成空串的最小次数。
【输入数据】
第一行一个整数 t 表示数据组数。
每组数据第一行一个整数 n 表示字符串长度,第二行一个字符串 s。
【输出数据】
每组数据输出一行一个整数表示答案,如果无法删成空串输出-1。
【样例输入】
2
7
abcdcba
3
xxx
【样例输出】
2
-1
【样例解释】
对于第一个样例,一种最优方案为 abcdcba->adcba->空串。
【数据范围】
对于 30%的数据,n<=10。
对于 60%的数据,n<=100。
对于 100%的数据,t<=20,n<=10^5。
#include<iostream> #include<cstdio> #include<cstring> #define maxn 110 #define INF 0x7fffffff using namespace std; int ans; struct node{ string s; int len; }; void solve(node now,int step){//已经进行了step次 if(step>=ans)return; for(int l=0;l<now.len;l++){ for(int r=l+1;r<now.len;r++){ int ll=l,rr=r;bool flag=0; while(ll<=rr){ if(now.s[ll]!=now.s[rr]){flag=1;break;} else ll++,rr--; } if(flag==0)continue; node nxt;nxt.s="";nxt.len=0; for(int i=0;i<l;i++)nxt.s+=now.s[i],nxt.len++; for(int i=r+1;i<now.len;i++)nxt.s+=now.s[i],nxt.len++; if(nxt.len==0){ ans=min(ans,step+1); return; } solve(nxt,step+1); } } } int main(){ // freopen("Cola.txt","r",stdin); freopen("string.in","r",stdin);freopen("string.out","w",stdout); int T; scanf("%d",&T); while(T--){ ans=INF; node str; scanf("%d",&str.len);cin>>str.s; solve(str,0); if(ans<INF)printf("%d\n",ans); else puts("-1"); } return 0; }