小b有一个n*m的矩阵A,矩阵的每个元素为一个字符,现在她希望删除其中的一些列,使得剩下的列在每一行形成的字符串的字典序不降。
即对于第i行,将剩下的列上的字符顺序拼接,形成一个字符串,字符串记作a[i]。要求a[i]<=ai+1。
请问小b最少要删多少列。
如A = {“abcdef”, “uvwxyz”},删除的列为第1,3,4列,删除后 A 为 {“bef”, “vyz”},且 “bef” <= “vyz”
样例解释:
删掉第一列,剩下的是"a" “b” “c”,“a” <= “b” <= “c”,满足条件。
输入
第一行输入一个正整数n,表示矩阵A的行数;
之后n行每行输入一个字符串,其长度相等;
1≤n,m≤100。
输出
输出一个非负整数,表示删掉的列数
输入样例
3
ca
bb
ac
输出样例
1
#include<bits/stdc++.h>
using namespace std;
string G[101];
int hascut[101];
int main()
{
ios::sync_with_stdio(false);
int n;
cin>>n;
for(int i=0;i<n;i++)
cin>>G[i];
int len=G[0].length();
int res=0;
for(int i=1;i<n;i++)
{
int reset=0;
for(int j=0;j<len;j++)
{
if(hascut[j]||G[i][j]==G[i-1][j])//已经被删或者相等
continue;
if(G[i][j]>G[i-1][j])
break;
else
{
hascut[j]=1;
res++;
reset=1;
}
}
if(reset)//有删列,从头开始重新找起
i=0;
}
cout<<res<<endl;
return 0;
}