题目链接
题目大意:判断公共后缀,如果有输出,没有则输出nai;
做法:反转字符求公共前缀(较为方便);求最短字符串长度,以他为基准访问字符串保证不越界;
#pragma warning(disable:4996);
#include <iostream>
#include<stdio.h>
#include<algorithm>
#include<string.h>
#include<string>
#include<stack>
#include<math.h>
#include<vector>
using namespace std;
int n, minlen = 256, ans = 0;
char s[100][256];
int main() {
scanf("%d", &n);
getchar();
for (int i = 0;i < n;i++)
{
//fgets(s[i], 256, stdin); 会多读取一个字符,导致ans不对无法输出正确结果(可能是回车)
//gets_s(s[i]); pat并不识别gets
scanf("%[^\n]%*c", s[i]);//读到'\n'结束读取,并将其读到的数据吸收,然后再抛弃一个字符(这个字符是'\n')得到正确结果
int len = strlen(s[i]);
if (len < minlen) minlen = len;//找最短的长度;
for (int j = 0;j < len / 2;j++) {//反转字符串,找公共后缀变为找前缀;
char temp = s[i][j];
s[i][j] = s[i][len - j - 1];
s[i][len - j - 1] = temp;
}
}
for (int i = 0;i < minlen;i++)//判断所有字符的第i个是否相等;
{
char c= s[0][i];//取第一个字符串的第i个
bool same = true;
for (int j = 1;j < n;j++)
{
if (c != s[j][i])//有不等的停止枚举说明,公共前缀已结束;
{
same = false;
break;
}
}
if (same) ans++;//计算公共前缀长度;
else break;//退出大循环;
}
//cout << ans;
//printf("%s", s[0]);
if (ans) {
for (int i = ans - 1;i >= 0;i--)
{
printf("%c", s[0][i]);//因为翻转过要写正常序的后缀,所以在此倒叙输出;
}
}
else { printf("nai"); }
return 0;
}