前言

传送门

正文

思路

题意是读入N个字符串,输出这N个字符串最长的公共后缀子串,如果没有最长的公共后缀子串,则输出"nai",解决思路还是比较容易想到,主要注意一下坑点,cin>>对字符后面的残留在缓冲区的分隔符不做处理。举个例子

int a;
string b;
cin>>a>>b;
cin>>a;
getline(cin,b);

输入:1[enter]hello[enter] 如果是用cin>>a>>b输入的话,这样两个>>都会忽略字符前的分隔符的,结果为a=1,b=“hello”,但是如果是第二个输入的方式,则getline不会将1后面的[enter]忽略掉,它会将其读取到b中,因为是换行符,所以替换成’\0’,代表结束,则hello会被屏蔽,但是依然存放在缓冲区里,这个时候需要再来一个getline,hello就会被读取。

参考题解

#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
/*
题意是读入N个字符串,输出这N个字符串最长的公共后缀子串,
如果没有最长的公共后缀子串,则输出"nai",首先 
使用getline(cin,str)逐行读入字符串,再将字符串翻转
,得出N个字符串中最长的字符串的长度len,再对每个字符串 
进行逐个字符遍历,若是公共字符,则加入到字符串res中,
若res.size()!=0,则表示有公共字符,所以逆序输出res,否则
直接输出nai。易错点:这里需要注意cin>>输入时,对后面残留在缓冲区
的分割符不做处理,因此额外需要使用getline(cin,s) 来读入n后面的enter换行。 
*/
int main(){
	int n,lens[100],len=-1;
	bool flag=false;
	cin>>n;
	string res,str[n],s;
	getline(cin,s);//读掉enter键 ,也可cin.get()读取换行字符
	for(int i=0;i<n;i++){
		getline(cin,str[i]);//读取一行字符串 
		reverse(str[i].begin(),str[i].end());//翻转 
		lens[i]=str[i].size();
		if(lens[i]>len)len=lens[i];//获取最长字符串的长度 (这个题直接改成获取最短的长度即可)
	}
	
	for(int i=0;i<len;i++){
		char ch[n];
		for(int j=0;j<n;j++){
			//需要掌握这种常用技巧 
			ch[j]=i<lens[j]?str[j][i]:'0';
		}
		for(int k=0;k<n-1;k++){
			if(ch[k]!=ch[k+1])//若相应位置字符不相同,则不是公共子串 
			flag=true; 
		}
		if(flag==true){
			break;
		}else{
			res+=ch[0];
		}
	}
	reverse(res.begin(),res.end());//重新翻转回来 
	if(res.size()!=0)//有公共子串 
	cout<<res<<endl;
	else cout<<"nai"<<endl;
	return 0;
}